gpt4 book ai didi

java - JAX-RS 2 : using Guava ListenableFuture for async resources

转载 作者:行者123 更新时间:2023-11-30 11:17:22 25 4
gpt4 key购买 nike

在 JAX-RS 2 中编写异步端点通常如下所示:

@GET
public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
new Thread(new Runnable() {

@Override
public void run() {
String result = veryExpensiveOperation();
asyncResponse.resume(result);
}

private String veryExpensiveOperation() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// ignore
}
return "DONE";
}
}).start();
}

但是,这种方法不是很好,因为它不是声明式的。我在一些 JAX-RS 应用程序中看到可以使用 Google Guava 并编写如下代码:

ListeningExecutorService executor = ...;

@GET
public ListenableFuture<String> asyncGet() {
return executor.submit(new Callable<String>() {
@Override
public String call() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// ignore
}
return "DONE";
}
});
}

但是,我不知道如何设置 JAX-RS 2 实现来接受这种端点,我也没有弄清楚其他实现是如何做到的。

我将如何配置,例如Jersey 接受这种异步声明?

最佳答案

FutureCallback 中恢复 asyncRresponse :

@GET
@Produces(MediaType.TEXT_PLAIN)
public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
ListenableFuture<String> future = asyncGet();
Futures.addCallback(future, new FutureCallback<String>() {

@Override
public void onSuccess(String result) {
asyncResponse.resume(result);
}

@Override
public void onFailure(Throwable exception) {
asyncResponse.resume(exception);
}
});
}

确保在 web.xml 中的 servlet 配置中启用了异步请求:

<servlet>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
...
<async-supported>true</async-supported>
</servlet>

并且您使用 servlet 3.0 API。

关于java - JAX-RS 2 : using Guava ListenableFuture for async resources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24382600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com