如何执行异步计算并同时处理其他http请求?

时间:2019-06-21 04:19:31

标签: java http asynchronous completable-future grizzly

我想同时处理几个http请求。这意味着我希望获取http请求的线程将请求的句柄移动到另一个线程,并且可用于获取新的请求,直到处理程序提供结果为止。如果有人可以告诉我如何正确操作,我将不胜感激。谢谢!

我尝试使用CompletableFuture,但是显然我做错了,因为获取请求的线程被阻止获取新请求,直到处理程序完成为止。

如您所见-仅在处理程序完成后(睡眠10秒),请求线程才获得新请求,因此处理程序在另一个线程中执行没有优势。

<form name="salesform" id="salesForm" onsubmit="return validateForm();" method="POST">
  

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调试[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]-   完成等待

1 个答案:

答案 0 :(得分:1)

我找到了一种不使用completableFuture的方法(我仍然不了解它的用处,如果最后您需要调用get()方法并被阻塞直到它结束,),但使用@Suspended AsyncResponse response,就像建议的agpt一样。

代码如下:

  @GET
  @Path("/{phoneNumber}")
  @Consumes("application/json")
   public void submit(@PathParam("phoneNumber") String phoneNumber, final @Suspended AsyncResponse response1) {
      log.debug("get a request " +phoneNumber);
      new Thread() {
         public void run() {
            String confirmation = process(phoneNumber);
            Response response = Response.ok(confirmation,
                                            MediaType.APPLICATION_XML_TYPE)
                                        .build();
            response1.resume(response);
         }
      }.start();
      log.debug("the submit finish " + phoneNumber);
   }


  public String process(String phoneNumber)
  {
        try {
            Thread.sleep(10000);
            log.debug("finish waiting "+phoneNumber);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String res = "hello" + phoneNumber;
        return res;
  }
  

2019-06-23 09:54:20,157调试[grizzly-http-server-0]   [com.xconnect.np.test.superquery.suppliers.http.QueryResource]-获取一个   请求1 2019-06-23 09:54:20,158调试[grizzly-http-server-0]   [com.xconnect.np.test.superquery.suppliers.http.QueryResource]-   提交完成1 2019-06-23 09:54:22,026调试[grizzly-http-server-0]   [com.xconnect.np.test.superquery.suppliers.http.QueryResource]-获取一个   请求2 2019-06-23 09:54:22,026调试[grizzly-http-server-0]   [com.xconnect.np.test.superquery.suppliers.http.QueryResource]-   提交完成2 2019-06-23 09:54:30,158 DEBUG [Thread-2]   [com.xconnect.np.test.superquery.suppliers.http.QueryResource]-   完成等待1 2019-06-23 09:54:32,027调试[线程3]   [com.xconnect.np.test.superquery.suppliers.http.QueryResource]-   完成等待2