我正在使用Jersey Client(v2.17)从我的应用程序拨打外部电话。
我发现了这个memory leak错误(CPU消耗非常高),这使我重新编写代码以使客户端像这样静态:
public class GeneralUtil {
private static final Client client = ClientBuilder.newClient()
public static String makeCall(String url) throws NotFoundException {
return client.target(url).request().get(String.class);
}
}
但是,现在我遇到了并发问题 - 我正在使用这个类来从多个线程调用。我继续得到:
org.apache.http.impl.execchain.RequestAbortedException: Request aborted
任何建议 - 我怎样才能防止内存泄漏,仍然使用客户端?
答案 0 :(得分:2)
如果您不想创建任意数量的Client
个对象,则可以使用ThreadLocal
并为每个线程创建一个对象。
您可以覆盖ThreadLocal.initialValue
以返回ClientBuilder.newClient()
以自动为新线程创建Client
个对象。
或者您可以使方法同步,但这意味着您一次只能执行一个请求。
以下是一些示例代码:
class GeneralUtil {
ThreadLocal<Client> client = new ThreadLocal<Client>() {
@Override
public Client initialValue() {
return ClientBuilder.newClient();
}
};
public static String makeCall(String url) throws NotFoundException {
return client.get().target(url).request().get(String.class);
}
...
}
答案 1 :(得分:1)
如Dejel最初所述,这是一个已知问题。
&#34;变通办法&#34;工作...但我相信这个问题很关键,应该由泽西岛队解决。
让Jersey团队知道这会影响你,登录JIRA并投票。它目前只有3票: