Лучший способ закрыть вызов клиента asyn c - PullRequest
3 голосов
/ 29 января 2020

У меня есть следующий код:

var threadsWaiter = new CountDownLatch(customers.size());
for(var c: List<Customer> customers) {
   sendSms(c.phoneNr, threadsWaiter)
}
threadsWaiter.await();

public void sendSms(String phoneNr, CountDownLatch threadsWaiter) {
  ResteasyClientBuilder.newClient()
            .target(smsUrl)                
            .queryParam("to", phoneNr)
            .queryParam("message", message)
            .request()
            .async()
            .get(new InvocationCallback<String>() {
                @Override
                public void completed(String res) {
                    threadsWaiter.countDown();
                    if (res != null && !res.contains("code=ok") {
                        logger.error("Received sms response for '{}'\n{}", phoneNr, res);
                    } else {                            
                        logger.debug("Sms sent to '{}'", phoneNr);
                    }
                }

                @Override
                public void failed(Throwable throwable) {
                    threadsWaiter.countDown();
                    logger.error("Error sending sms for {}: \n{}", phoneNr, throwable.getMessage());
                }
            });
}

И я получаю из консоли следующее предупреждение:

RESTEASY004687: Закрытие класса org.jboss.resteasy.client. jaxrs.engines.ApacheHttpClient43Engine экземпляр для вас. Пожалуйста, закройте клиентов самостоятельно.

Как правильно закрыть этот вызов клиента? Потому что это может быть источником потенциальной утечки памяти в приложении. И даже я получаю это предупреждение от RestEasy, что он автоматически закрывает клиент для меня, но у меня есть сильное чувство, что он не закрывает все клиенты, так как я вижу огромное увеличение памяти в показателях, а это не так "go вниз "через некоторое время.

Я поместил вызов оставшегося клиента между try-finally, но проблема в том, что вы можете закрыть клиент до завершения вызова. Можно ли закрыть клиент в завершенных (..) и сбойных (..) методах в InvocationCallback или есть лучший способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...