Параллельные / параллельные вызовы в vertx - PullRequest
1 голос
/ 11 июля 2019

Я читаю данные из базы данных в бэкэнде (код vertx), и в каждой строке есть URL-адрес, по которому я буду выполнять HTTP-запрос «GET» для поля состояния в ответ, который я сохраняю обратно в базу данных и отправляю в пользовательский интерфейс.

Метод CreateRequests выполняет http-запросы. Я хочу сделать это одновременно.

        List<Future> toComplete=new ArrayList<>();
        Vertx vertx = Vertx.vertx();int i;
        for(i=0;i<requestsListInDept.size();i++)
        {
            String reqtype = requestsListInDept.getString(i);
            JsonObject requestProperties = dataReader.getRequestProperties(dept,reqtype);
           toComplete.add(Future.future());
           int currrent=i;
            vertx.executeBlocking(future->{
                System.out.println("calling for ");
                String individualResponse  = accReq.createRequests(requestContext,reqtype,empid,requestProperties);
               toComplete.get(currrent).complete(individualResponse);
                future.complete(individualResponse);
            },false,res->{
                JsonArray obj=new JsonArray( (res.result()).toString() );
                for(int index=0;index<obj.size();index++)
                {
                    JsonObject requestResponse=obj.getJsonObject(index);
                    response.add(requestResponse);

                }
                toComplete.get(currrent).complete(res.result());
            });
        }
      CompositeFuture.all(toComplete).setHandler(e -> {
                String collect = e.result()
                        .list()
                        .stream()
                        .map(Object::toString)
                        .collect(Collectors.joining(" ------- "));
                System.out.println(collect);
            });

return ;

Как эффективно выполнять одновременные вызовы, объединять ответы (которые я буду отправлять в пользовательский интерфейс) и хранитьих обратно в БД

Я зацикливаю все URL и делаю запросы get в цикле. Если есть большие данные, я получаю Timeout (Это очевидно)

1 Ответ

0 голосов
/ 11 июля 2019

Vert.x использует шаблон реактора, поэтому вы можете достичь аналогичного результата, используя шаблон, а не многопоточность и executeBlocking.Использование многопоточности и блокировка вызовов в Vert.x рекомендуется только в том случае, если нет способа поддержать шаблон (то есть асинхронный способ не существует).

Возможно, этот пример может помочь вам

  public void doCall() {
    List<Future> toComplete = new ArrayList<>();
    WebClientOptions options = new WebClientOptions().setSsl(true);
    WebClient webClient = WebClient.create(Vertx.vertx(), options);
    IntStream.range(0, 15).forEach(counter -> {
      toComplete.add(Future.future());
      int current = counter;
      webClient.get(443, "google.com", "/")
               .send(httpResponseAsyncResult -> {
                 String googleResult = httpResponseAsyncResult.result().bodyAsString();
                 toComplete.get(current).complete(googleResult);
               });
      System.out.println("Calling google: times " + ++counter);
    });
    CompositeFuture.all(toComplete).setHandler(e -> {
      String collect = e.result()
                        .list()
                        .stream()
                        .map(Object::toString)
                        .collect(Collectors.joining(" ------- "));
      System.out.println(collect);
    });
  }

Надеюсь, это поможет

...