При использовании 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();
}
}