REST客户端上的容错@Asynchronous-annotation在Windows上会导致核心转储,在MacOS上会导致以下错误:
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ./src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 873受影响的版本:(打开OpenJDK 64位服务器VM上的自由20.0.0.6/wlp-1.0.41.cl200620200528-0414)版本11.0.8+10-LTS
使用的功能:
[appSecurity-3.0, beanValidation-2.0, cdi-2.0, concurrent-1.0, distributedMap-1.0, ejbLite-3.2, el-3.0, jaxb-2.2, jaxrs-2.1, jaxrsClient-2.1, jdbc-4.2, jndi-1.0, jpa-2.2, jpaContainer-2.2, json-1.0, jsonb-1.0, jsonp-1.1, monitor-1.0, mpConfig-1.4, mpFaultTolerance-2.1, mpHealth-2.2, mpMetrics-2.3, mpOpenAPI-1.1, mpRestClient-1.4, requestTiming-1.0, servlet-4.0, ssl-1.0, transportSecurity-1.0].重新生产:
@ApplicationScoped
@RegisterRestClient(baseUri = "https://postman-echo.com")
public interface TestingClient {
@GET
@Asynchronous
@Path("delay/4")
@Consumes(value = MediaType.APPLICATION_JSON)
CompletionStage<Response> doesItCrashWithDelay(String dummyData);注入它:
@Inject
@RestClient
private TestingClient testingClient;使用它:
@GET
@Path("doesitcrash")
public void doesItCrash() {
final Response response = testingClient.doesItCrashWithDelay("dummydata").toCompletableFuture().join();
logger.info(response.readEntity(String.class));
}解决方法是让另一个CDI bean调用具有容错注释的rest客户端。但根据这篇博客文章,REST客户端接口应该能够有容错注释:https://openliberty.io/blog/2020/06/04/asynchronous-programming-microprofile-fault-tolerance.html
由于CompletionStage,在已经异步的REST客户端上是否允许@Asynchronous?如前所述,所有其他注释,如@Timeout和@Retry似乎都是有效的。
发布于 2021-08-11 13:54:02
首先,您100%正确地认为在MP Rest客户端接口方法上不需要@Asynchronous注释-根据MP Rest Client specification,CompletionStage的返回类型使其成为异步的。如果您删除了@Asynchronous注释,它应该可以工作。
在研究JVM错误消息时,我遇到了这个helpful post,它表明JVM遇到了一个非常大的异常--可能是一个StackOverflowError。我的猜测是,发生错误是因为现在有两种不同的异步机制(MP Rest客户端和MP容错)一起运行-可能运行得不太好。如果看不到异常堆栈跟踪,我们就不能确定。
我首先建议删除注释并验证它是否正常工作--这可能比使用单独的CDI bean更好。接下来,我建议在https://github.com/OpenLiberty/open-liberty/issues上打开一个问题,以研究更好的整体解决方案。
https://stackoverflow.com/questions/64424384
复制相似问题