- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试 websphere liberty 的容错(microprofile)实现。因此,我制作了一个简单的 REST 服务,其中的资源会 hibernate 5 秒:
@Path("client")
public class Client {
@GET
@Path("timeout")
public Response getClientTimeout() throws InterruptedException {
Thread.sleep(5000);
return Response.ok().entity("text").build();
}
}
我在另一个 REST 服务的同一应用程序中调用此客户端:
@Path("mpfaulttolerance")
@RequestScoped
public class MpFaultToleranceController {
@GET
@Path("timeout")
@Timeout(4)
public Response getFailingRequest() {
System.out.println("start");
// calls the 5 seconds-ressource; should time out
Response response = ClientBuilder.newClient().target("http://localhost:9080").path("/resilience/api/client/timeout").request().get();
System.out.println("hello");
}
}
现在我预计 getFailingRequest() 方法会在 4 毫秒后超时并抛出异常。实际行为是应用程序打印“start”,等待 5 秒直到客户端返回,打印“hello”,然后抛出“org.eclipse.microprofile.faulttolerance.exceptions.TimeoutException”。
我打开了更多调试信息:
<logging traceSpecification="com.ibm.ws.microprofile.*=all" />
在 server.xml 中。我得到这些信息,即使在调用客户端之前也已注册超时!但线程并没有被中断。
(如果有人告诉我如何在这里获得漂亮的堆栈跟踪......我可以做到。)
因为这是一个非常基本的例子:我在这里做错了什么吗?我该怎么做才能使这个例子正常运行。
谢谢
编辑:在 WebSphere Application Server 18.0.0.2/wlp-1.0.21.cl180220180619-0403) auf Java HotSpot(TM) 64 位服务器 VM,版本 1.8.0_172-b11 (de_DE) 上运行此示例,具有以下功能webProfile-8.0、mpFaultTolerance-1.0 和 localConnector-1.0。
编辑:解决方案,感谢 Andy McCright 和 Azquelt。由于调用不能被中断,我必须使其异步。所以你有 2 个线程:第一个线程通过调用调用第二个线程。第一个线程将被中断,第二个线程将保留直到调用完成。但现在您可以继续进行故障处理、打开电路等,以防止进一步调用损坏的服务。
@Path("mpfaulttolerance")
@RequestScoped
public class MpFaultToleranceController {
@Inject
private TestBase test;
@GET
@Path("timeout")
@Timeout(4)
public Response getFailingRequest() throws InterruptedException, ExecutionException {
Future<Response> resp = test.createFailingRequestToClientAsynch();
return resp.get();
}
}
客户端调用:
@ApplicationScoped
public class TestBase {
@Asynchronous
public Future<Response> createFailingRequestToClientAsynch() {
Response response = ClientBuilder.newClient().target("http://localhost:9080").path("/resilience/api/client/timeout").request().get();
return CompletableFuture.completedFuture(response);
}
}
最佳答案
它确实使用 Thread.interrupt()
中断线程,但遗憾的是并非所有 Java 操作都会响应线程中断。
很多东西确实通过抛出 InterruptedException 来响应中断(例如 Thread.sleep()
、 Object.wait()
、 Future.get()
和 InterruptableChannel
的子类),但 InputStreams 和 Sockets 不会。
我怀疑您(或您用来发出请求的库)正在使用不可中断的 Socket,因此您不会看到您的方法提前返回。
这特别不直观,因为 Liberty 的 JAX-RS 客户端不会响应 Andy McCright 提到的线程中断。我们知道情况不太好,我们正在努力改善情况。
关于java - WLP MicroProfile (FaultTolerance) 超时实现不会中断线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427677/
我使用 Wildfly Swarm 生成器创建了一个演示应用程序,我想在其上添加 MicroProfile Rest Client。 我刚刚添加了依赖项: org.wildfly.swarm
尝试在 Java HotSpot(TM) 64 位服务器 VM 版本 1.8.0_161-b12 上测试 WebSphere Liberty (WebSphere Application Server
我试图创建问题的最小示例。 假设我们有简单的返回对象: public class Result { @Schema(example = "2012-01-01") private Lo
我正在测试 websphere liberty 的容错(microprofile)实现。因此,我制作了一个简单的 REST 服务,其中的资源会 hibernate 5 秒: @Path("clien
有人知道是否计划在独立的 Wildfly 服务器(不是 Thorntail)中实现 Eclipse Microprofile 吗?由于 microprofile 中的功能似乎可用于任何应用程序服务器,
这个问题是关于以可移植的方式读取 REST 服务中的配置的正确方法,例如应在 Thorntail 2.4.0 和 Wildfly 15 上运行。 这是 Thorntail 建议的原始实现 @Injec
我想在运行时选择.properties 文件。可以使用 microprofile-config 吗?因此,我不想使用 META-INF/microprofile-config.properties,而
在使用 Eclipse Microprofile 之前,我们已经通过 io.openapitools.swagger:swagger-maven-plugin 生成了 open-api 文件。该插件依
随着 WebSphere Liberty 的引入,人们与经典的 WebSphere Application Server 产生了混淆。 例如 WebSphere Liberty 支持 MicroPro
我正在使用eclipse-microprofiles-config v1.1 在我的 Jersey 2.26 中。 我完整的build.gradle如下。 apply plugin: 'java' a
我想在我的 Web 应用程序中使用 MP FaultTolerance 功能中的熔断功能。现在我不知道如何知道这个函数是否在我的应用程序中运行。我想自动跟踪 MP 容错添加的 MP 指标的值,如 ht
我正在尝试在 quarkus 中注入(inject)对象列表,但收到错误“没有为类 ExternalApiParam 注册转换器”。 我的 yaml 是: custom: external-api
我正在使用 Helidon MP 开发微服务应用程序。到目前为止,我的经历非常棒。但我最终还是在寻找 Helidon MP 的启动/关闭 Hook 。我试图通过搜索和 Helidon Javadoc
我正在使用 Helidon MP 开发微服务应用程序。到目前为止,我的经历非常棒。但我最终还是在寻找 Helidon MP 的启动/关闭 Hook 。我试图通过搜索和 Helidon Javadoc
在我的服务器应用程序中,我想使用 MicroProfile REST 客户端使用一些第三方 API。为此,我需要发送带有不记名 token 的 Authorization header 。 我不想在进
我有一个 API,当我通过 postman 调用它时,它会在以下情况下给出以下响应: 案例1:状态码:200 {"success": "student record is present", "e
我正在开发一个小型后端。为了确保这一点,我想使用 JWT。我的技术堆栈是:Payara & Keycloak幸运的是,我找到了一个很棒的教程( https://kodnito.com/posts/mi
我正在尝试构建一个使用 quarkus-rest-client 调用 API 的简单应用程序。 . 我必须注入(inject)一个 API key 作为 header ,该 header 对于 API
基于此文档:https://www.ibm.com/support/knowledgecenter/de/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twl
我希望使用 Helidon 提供服务,但想知道它是否支持 Spring,因为我的应用程序是使用 Spring 构建的 helidon 的示例是使用 CDI 和 Weld 构建的 提前致谢! 最佳答案
我是一名优秀的程序员,十分优秀!