Apache HttpAsyncClient и CountDownLatch - PullRequest
0 голосов
/ 06 марта 2019

При использовании apache htttpasyncclient как правильно обрабатывать различные случаи исключений? Рассмотрим следующий псевдокод, основанный на этом примере , где я добавил параметр потребителя к вызову execute. Намерение состоит в том, чтобы сделать асинхронный http-запрос, в котором данные обрабатываются в виде потока, когда поступают байты, а не ожидать полного ответа перед обработкой. Могут возникнуть различные проблемы, такие как исключение тайм-аута в запросе http, сбой подключения (может быть, нет сети) и т. Д. Всегда ли гарантируется, что, например, в случае тайм-аута с ответом, который не возвращается вовремя, releaseResources () всегда называется. Вопрос в том, где latch.countDown () необходимо поместить в приведенный ниже код, чтобы всегда гарантировать, что вызов await не просто зависает, независимо от того, что является исключением. Достаточно ли вызова latch.countDown () в StreamConsumer.releaseResources () для предотвращения зависания в ожидании?

public static void main(final String[] args) throws Exception {
    client.execute(HttpAsyncMethods.createGet(u), new StreamConsumer(...), new FutureCallback<Boolean>() {
        @Override
        public void cancelled() {
            // Is latch call needed here?
            // latch.countDown();
        }

        @Override
        public void completed(Boolean response) {
            // Is latch call needed here?
            // latch.countDown();
        }

        @Override
        public void failed(Exception e) {
            // Is latch call needed here?
            // latch.countDown();
        }
    });

    latch.await();
}


static class StreamConsumer extends AsyncByteConsumer<Boolean> {
    @Override
    protected void onResponseReceived(final HttpResponse response) {
       latch.countDown();
    }

    @Override
    protected void onByteReceived(final ByteBuffer buf, final IOControl ioctrl) throws IOException {

    }

    @Override
    protected void releaseResources() {
        latch.countDown();
    }

}

1 Ответ

0 голосов
/ 06 марта 2019
Метод

CloseableHttpAsyncClient#execute завершается немедленно после отправки запроса в конвейер выполнения запроса и возвращает объект Future, представляющий будущий результат операции.

Поэтому защелка в примере необходима для того, чтобы клиент не отключился сразу после вызова CloseableHttpAsyncClient#execute.

Если использовать CloseableHttpAsyncClient в качестве одиночного тона с определенным жизненным циклом (как следует), синхронизация завершения запроса и завершения работы клиента могут быть ненужными.

...