Jersey 客户端、内存泄漏、静态和并发
Jersey Client, memory leak, static and concurrency
我正在使用 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);
}
}
但是,现在我遇到了并发问题 - 我正在使用此 class 从多个线程调用。我不断得到:
org.apache.http.impl.execchain.RequestAbortedException: Request aborted
任何建议 - 我怎样才能防止内存泄漏,并继续使用客户端?
如果您不想创建任意数量的 Client
个对象,您可以使用 ThreadLocal
每个线程一个对象。
您可以将 ThreadLocal.initialValue
覆盖为 return 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);
}
...
}
正如 Dejel 最初所述,这是一个已知问题。
"workarounds" 有效...但我认为这个问题很严重,应该由 Jersey 团队解决。
登录 JIRA 并投赞成票,让 Jersey 团队知道这会影响您。它目前只有 3 票 :
我正在使用 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);
}
}
但是,现在我遇到了并发问题 - 我正在使用此 class 从多个线程调用。我不断得到:
org.apache.http.impl.execchain.RequestAbortedException: Request aborted
任何建议 - 我怎样才能防止内存泄漏,并继续使用客户端?
如果您不想创建任意数量的 Client
个对象,您可以使用 ThreadLocal
每个线程一个对象。
您可以将 ThreadLocal.initialValue
覆盖为 return 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);
}
...
}
正如 Dejel 最初所述,这是一个已知问题。
"workarounds" 有效...但我认为这个问题很严重,应该由 Jersey 团队解决。
登录 JIRA 并投赞成票,让 Jersey 团队知道这会影响您。它目前只有 3 票 :