У меня возникли проблемы с некоторым кодом, который я тестирую с помощью AsyncHTTPClient. Вот общий конфиг
this.config = (new AsyncHttpClientConfig.Builder())
.setAllowPoolingConnection(true)
.setAllowSslConnectionPool(true)
.addRequestFilter(new ThrottleRequestFilter(10))
.setMaximumConnectionsPerHost(20)
//.setMaximumConnectionsTotal(20)
.setRequestTimeoutInMs(100000)
.build();
this.client = new AsyncHttpClient(new NettyAsyncHttpProvider(config));
(Обратите внимание, что максимальное количество подключений закомментировано из-за какой-то странной ошибки при использовании ThrottleRequestFilter, см. здесь https://groups.google.com/forum/?fromgroups=#!topic/asynchttpclient/nEnQnPtCP2g)
Теперь вот некоторый тестовый код,
FileInputStream fstream = new FileInputStream("import.txt");
DataInputStream dstream = new DataInputStream(fstream);
BufferedReader reader = new BufferedReader(new InputStreamReader(dstream));
while ((line = reader.readLine()) != null) {
//Some code to build and create a request using the build function and then perform a GET operation. Request is built using Java's Future object from java.concurrent
}
Если файл import.txt содержит менее 100 строк простого текста, такого как этот
196 242 3 881250949
Все работает нормально, все запросы проходят и при проверке ответов все нормально. Все, что больше 100, и я начинаю получать тайм-ауты, а в случаях, например, 1000+, я фактически начинаю сталкиваться с ошибками памяти permGen.
Я думал, что ThrottleRequestFilter должен ограничивать максимальное количество потоков до 10 и обрабатывать только 10 за раз. Почему он вылетает, когда текстовый файл содержит более 100 строк?
Я также пытался переключиться на использование реализации Grizzly, но это также не работает. Я начинаю подозревать, что это либо то, как я написал тестовый код, либо асинхронный HTTP-клиент действительно имеет некоторые проблемы при создании большого количества запросов. Если да, то есть ли другие хорошие асинхронные http-клиенты для java?