【发布时间】:2020-05-14 09:22:43
【问题描述】:
我有以下代码:
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: Closing a class org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine instance for you. Please close clients yourself.
关闭此客户呼叫的正确方法是什么?因为这可能是应用程序中潜在内存泄漏的来源。甚至我从 RestEasy 收到警告,它会自动为我关闭客户端,但我有一种强烈的感觉,它不会关闭所有客户端,因为我看到指标中的内存大幅增加,而且这不会“去一段时间后“下来”。
我已经在 try-finally 之间放置了其余的客户端调用,但这样做的问题是您可以在调用完成之前关闭客户端。 InvocationCallback 中的completed(..) 和failed(..) 方法中关闭客户端是否可以,还是有更好的方法?
【问题讨论】: