У меня есть следующий код:
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 или есть лучший способ?