我正在开发一个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。情况还是和以前一样。
1条答案
按热度按时间kgqe7b3p1#
我们和我的团队一起解决了这个问题。
我们的微服务部署在kubernetes上,只有一个吊舱。结果发现pod过载了,无法处理更多的请求。
解决办法是在Kubernetes上复制我们的吊舱。