【发布时间】:2019-06-21 04:19:31
【问题描述】:
我想同时处理几个 http 请求。这意味着我希望获取 http 请求的线程将请求的句柄移动到另一个线程并且可用于获取新请求,直到处理程序提供结果。如果有人能告诉我如何正确,我将不胜感激。谢谢!
我尝试使用 CompletableFuture,但显然我做错了什么,因为在处理程序完成之前,获取请求的线程被阻止获取新请求。
如您所见 - 只有在处理程序完成后(10 秒的睡眠) - 请求线程才会收到新请求,所以我没有优势处理程序在另一个线程中执行。
@GET
@Path("/{phoneNumber}")
@Produces(MediaType.APPLICATION_JSON)
public Response query() throws InterruptedException, ExecutionException
{
log.debug("get a request");
String message = calculateAsync().get();
return Response.ok(message).build();
}
public Future<String> calculateAsync() throws InterruptedException
{
CompletableFuture<String> completableFuture = new CompletableFuture<String>();
completableFuture = CompletableFuture.supplyAsync(() ->
{
try {
Thread.sleep(10000);
log.debug("finish waiting");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "hello";
});
return completableFuture;
}
2019-06-21 06:38:48,080 调试 [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - 得到一个 请求 2019-06-21 06:38:58,081 调试 [ForkJoinPool.commonPool-worker-1] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - 完成等待 2019-06-21 06:38:58,116 DEBUG [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - 得到一个 请求 2019-06-21 06:39:08,113 调试 [ForkJoinPool.commonPool-worker-1] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - 等待结束
【问题讨论】:
-
我对 Java 8 不是很熟悉,但肯定有一个叫做 Callback 的东西,使用它你应该能够管理你的异步计算和返回响应。您可能还需要检查或更改您的 REST API 实现。 (虽然不确定)
-
你能查一下callicoder.com/java-8-completablefuture-tutorial吗?看来您应该能够使用
thenApply方法处理它。而且我认为@Suspended AsyncResponse response也很有用。 -
也在本教程中:他的 get 方法仍然阻塞了主线程: CompletableFuture
whatsYourNameFuture = CompletableFuture.supplyAsync(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { throw new IllegalStateException(e); } return "Rajeev"; }); // 使用 thenApply() 将回调附加到 Future CompletableFuture greetingFuture = whatsYourNameFuture.thenApply(name -> { return "Hello " + name; }); // 阻塞并获取未来的结果。 System.out.println(greetingFuture.get());
标签: java http asynchronous completable-future grizzly