首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MicroProfile REST客户端上的容错@异步导致windows上的开放自由核心转储

MicroProfile REST客户端上的容错@异步导致windows上的开放自由核心转储
EN

Stack Overflow用户
提问于 2020-10-19 17:15:13
回答 1查看 160关注 0票数 0

REST客户端上的容错@Asynchronous-annotation在Windows上会导致核心转储,在MacOS上会导致以下错误:

代码语言:javascript
复制
 *** 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

使用的功能:

代码语言:javascript
复制
[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].

重新生产:

代码语言:javascript
复制
@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);

注入它:

代码语言:javascript
复制
@Inject
@RestClient
private TestingClient testingClient;

使用它:

代码语言:javascript
复制
@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似乎都是有效的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-11 13:54:02

首先,您100%正确地认为在MP Rest客户端接口方法上不需要@Asynchronous注释-根据MP Rest Client specificationCompletionStage的返回类型使其成为异步的。如果您删除了@Asynchronous注释,它应该可以工作。

在研究JVM错误消息时,我遇到了这个helpful post,它表明JVM遇到了一个非常大的异常--可能是一个StackOverflowError。我的猜测是,发生错误是因为现在有两种不同的异步机制(MP Rest客户端和MP容错)一起运行-可能运行得不太好。如果看不到异常堆栈跟踪,我们就不能确定。

我首先建议删除注释并验证它是否正常工作--这可能比使用单独的CDI bean更好。接下来,我建议在https://github.com/OpenLiberty/open-liberty/issues上打开一个问题,以研究更好的整体解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64424384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档