Как дождаться завершения всех запросов

Я использую ning AsyncHttpClient из программы командной строки. Мне нужно дождаться завершения всех запросов, чтобы я мог безопасно вызывать close() на клиенте. Проблема в том, что я делаю много запросов из разных частей программы. Разделенный собственный код ниже, который показывает один сценарий, в котором я делаю вложенный HTTP-запрос из onCompleted другого запроса:

final AsyncHttpClient asyncHttpClient = new AsyncHttpClient();

Future<Response> f1 = asyncHttpClient.prepareGet(url).execute(
    new AsyncCompletionHandler<Response>() {

        public Response onCompleted(Response response)
            throws Exception {

            //Make more HTTP calls
            Future f2 = asyncHttpClient.prepareGet(url).execute(...);

            return response;
        }
    });

Это только пример кода. Реальный код более сложен и имеет гораздо больше HTTP-вызовов. Как лучше всего убедиться, что все вызовы завершены, прежде чем я позвоню close() для клиента?


person RajV    schedule 16.02.2015    source источник
comment
Вы когда-нибудь догадывались об этом?   -  person shadanan    schedule 08.07.2016


Ответы (1)


Для меньшего количества запросов может сработать сбор всех Future, а затем использование CompletableFuture.allOf(futureCollection).get().

Согласно документам, это тоже может работать (еще не проверено)

((DefaultAsyncHttpClient)asyncHttpClient)
  .getEventLoopGroup()
  .awaitTermination(1, TimeUnit.MINUTES);
person Tim Van Laer    schedule 20.09.2017