当前位置: 首页 > 知识库问答 >
问题:

我的假客户端为服务器响应保持连接打开,但服务器在返回任何内容之前会等待我的客户端关闭连接

乐正浩言
2023-03-14

我正在开发一个java微服务,它有来自和到jBPM服务器的内部调用。在我的微服务中,我实现了一个@菲尼客户端(org.springframework.cloud.openfeign.菲尼客户端)来调用jBPM服务器,特别是第一次调用必须启动jBPM进程。

@FeignClient(name = "${resource.jbpmService.name}",
    url = "${resource.jbpmService.url}",
    path = "${resource.jbpmService.path}",
    configuration = com.my.MsClientErrorDecoder.class)
public interface JbpmServiceResource {

    @PostMapping(path = "/server/containers/{containerID}/processes/{processID}/instances",
        consumes = "application/json",
        produces = "application/json")
    public Long startProcess(
        @RequestHeader("Authorization") String authHeader,
        @PathVariable(name = "containerID") String containerID,
        @PathVariable(name = "processID") String processID,
        @RequestBody(required = true) StartProcessBody idRequest);
}

当“startProcess”调用启动时,我的客户端成功地联系了jBPM服务器。此时,jBPM在完成上述请求之前,必须调用我的微服务的API来检索它所需的基本信息。然而,@FeignClient似乎不接受任何传入的请求,直到“startProcess”完成并且jBPM服务器同时等待。在等待“startProcess”的读取超时后,@FeignClient进入超时并抛出异常:

假装RetryableException:执行POST时读取超时http://xx.yy.zz.ww:8080/kie-服务器/服务/rest/服务器/容器/jBPMContainerName/进程/jBPMProcessName/外部html" target="_blank">实例。假装异常。errorExecuting(FeignException.java:84)~[feign-core-10.1.0.jar!/:?]在外国。SynchronousMethodHandler。executeAndDecode(SynchronousMethodHandler.java:113)~[feign-core-10.1.0.jar!/:?]在外国。SynchronousMethodHandler。invoke(SynchronousMethodHandler.java:78)~[feign-core-10.1.0.jar!/:?]在外国。ReflectiveFeign$FeignInvocationHandler。调用(ReflectiveFeign.java:103)~[feign-core-10.1.0.jar!/:?]在com。太阳代理$Proxy215.startProcess(未知源)~[?:?]

[JbpmServiceResources#start Process]

因此,“start Process”返回HTTP 500错误并关闭调用。只有在这一点上,jBPM服务器才会注意到连接是空闲的,并调用我的API“getRequest estInfo”微服务来检索基本信息。最后,jBPM服务器返回预期作为“start Process”输出的Process InstanceID。

@Service
@RestController
@Validated
@RequestMapping(BASEURL)
public class UawJbpmService {

    @GetMapping("/get-request-info/{idRequest}")
    public UawRequestInfoJBPM getRequestInfo(@PathVariable @NotNull int idRequest) {

        return uawJbpmComponent.getRequestInfo(idRequest);
    }
}

这个调用在几毫秒内就可以了(HTTP 200)。对于每个单独的调用,我的微服务和jBPM之间没有可达性问题。问题是我的微服务似乎不接受多个连接(特别是到/来自jBPM)。另一件事是对jBPM的初始调用使用内部jBPM逻辑,我们无法修改它。

我怎样才能做到这一点?

  1. 我曾尝试将输出类型从“startProcess”更改为String,然后再更改为void,但这两种方法都不起作用

共有1个答案

鲁阳焱
2023-03-14

我们和我的团队一起解决了这个问题。

我们的微服务部署在Kubernetes上,我们只有一个吊舱。结果发现POD过载,无法处理更多请求。

解决方案是在库伯内特斯上创建我们的吊舱副本。

 类似资料:
  • 我有一个示例Spring启动应用程序来运行图形QL服务器,具有作为客户端,我的pom有以下依赖项: 当我尝试从客户端连接时,出现以下错误: 狩猎决议好心建议。 我还有几个问题: 我应该使用SimpleGraphQLHttpServlet将请求路由到endpoint吗 我正在React UI上使用apollo client,那么它是强制使用apollo server还是spring boot可以工作

  • 我使用的代码女巫只允许4个不同端口上的4个连接。此代码正在工作,但当客户端关闭连接时,它无法重新建立连接。连接被拒绝。认为是因为线程关闭。如何解决这个问题?我无法更改端口号... 从套接字导入* BUFF=25 def服务器(主机、端口): 如果名称==“main”:导入线程

  • 客户端应用程序在以下代码处挂起:

  • 编辑2:我切换到,并用包装客户端工厂,这样设备就可以很好地到达后端。但是当后端发回一些东西时,我会得到错误的出站套接字,客户机套接字死亡。我认为这是因为后端没有正确路由消息所必需的头。如何捕获此信息?我的配置类如下:

  • 我目前有一个在非阻塞模式下使用 NIO java 库编写的桌面服务器。您可以在此处找到完整的服务器项目。我还创建了一个用于测试目的的非阻塞 NIO 客户端。你可以在这里找到这个项目。最后,服务器应该用于Android即时通讯应用程序。我使客户端和服务器都基于发送“数据包”进行通信的想法。我的意思是,Packet 类的引用被打包到字节缓冲区中并通过套接字通道发送。然后,它们在另一端反序列化并执行。

  • 使用依赖关系spring-cloud-starter-zipkin,应用程序应该在sleuth触发时连接到zipkin服务器。我没有启动zipkin服务器,所以它应该抛出一个连接异常。但什么也没发生。而当我启动zipkin服务器时,它不能接收任何东西。 应用程序.属性 和日志