Как выполнить асинхронный расчет и одновременно обрабатывать другие http-запросы? - PullRequest
0 голосов
/ 21 июня 2019

Я хочу обрабатывать несколько запросов 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-2106: 38: 48,080 DEBUG [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - получить запрос 2019-06-21 06: 38: 58,081 DEBUG [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 DEBUG [ForkJoinPool.commonPool-worker-1] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - завершить ожидание

1 Ответ

1 голос
/ 23 июня 2019

Я нашел способ сделать это, не используя completetableFuture (что я до сих пор не понимаю, как это полезно, если в конце вам нужно вызвать метод 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 DEBUG [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - получить запрос 1 2019-06-23 09: 54: 20,158 DEBUG [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - отправить окончание 1 2019-06-23 09: 54: 22,026 DEBUG [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - получить запрос 2 2019-06-23 09: 54: 22,026 DEBUG [grizzly-http-server-0] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - отправить финиш 2 2019-06-23 09: 54: 30,158 DEBUG [Тема-2] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - окончание ожидания 1 2019-06-23 09: 54: 32,027 DEBUG [Тема-3] [com.xconnect.np.test.superquery.suppliers.http.QueryResource] - дожидаюсь 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...