myfeignclient为服务器响应保持连接打开,但是服务器等待我的客户端关闭连接,然后返回任何内容

lymnna71  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(413)

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

我的“startprocess”api:

@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必须调用microservice的api来检索它所需的基本信息。然而,@feignclient似乎不接受任何传入的请求,直到“startprocess”完成并且jbpm服务器同时等待。在等待“startprocess”的读取超时后,@feignclient进入超时并抛出异常:
feign.retryableexception:执行post时读取超时http://xx.yy.zz.ww:8080/kie server/services/rest/server/containers/jbpmcontainername/processes/jbpmprocessname/instances at feign.feignexception.errorexecuting(feignexception)。java:84)~[feign-core-10.1.0.jar!/:?]在feign.synchronousmethodhandler.executeAndCode(synchronousmethodhandler。java:113)~[feign-core-10.1.0.jar!/:?]在feign.synchronousmethodhandler.invoke(synchronousmethodhandler。java:78)~[feign-core-10.1.0.jar!/:?]在feign.reflectivefeign$feigninvocationhandler.invoke(reflectivefeign。java:103)~[feign-core-10.1.0.jar!/:?]在com.sun.proxy.$proxy215.startprocess(未知源)~[?:?]
[jbpmserviceresource#startprocess]<---错误sockettimeoutexception:读取超时(10005ms)
因此,“startprocess”返回http500错误并关闭调用。只有在这一点上,jbpm服务器才注意到连接是免费的,并调用microservice让api“getrequestinfo”检索基本信息。最后,jbpm服务器将processinstanceid作为“startprocess”的输出返回。

我的“getrequestinfo”api:

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

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

        return uawJbpmComponent.getRequestInfo(idRequest);
    }
}

这个调用在几毫秒内正常(http200)。我的微服务和jbpm之间对于每个单独的调用都没有可达性问题。问题是我的微服务似乎不接受多个连接(特别是到jbpm的/来自jbpm的连接)。另一件事是,对jbpm的初始调用使用内部jbpm逻辑,我们不能修改它。
我该怎么做?

我已经试过了

我尝试过将输出类型从“startprocess”更改为string,然后再更改为void,但这两种方法都不起作用。
我尝试过增加假连接超时和读取超时,但效果不太好。
我已经尝试创建第二个微服务作为我的初始微服务和jbpm之间的中间件。想法是调用中间件,然后调用jbpm来启动其进程。在本例中,我的初始微服务保持与中间件的连接打开,jbpm等待连接关闭。只有在超时之后,jbpm才调用“getrequestinfo”,但是我的微服务已经返回了http500。情况还是和以前一样。

kgqe7b3p

kgqe7b3p1#

我们和我的团队一起解决了这个问题。
我们的微服务部署在kubernetes上,只有一个吊舱。结果发现pod过载了,无法处理更多的请求。
解决办法是在Kubernetes上复制我们的吊舱。

相关问题