Jersey客户端,内存泄漏,静态和并发

时间:2015-06-05 12:03:21

标签: java concurrency jersey jersey-2.0 jersey-client

我正在使用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

任何建议 - 我怎样才能防止内存泄漏,仍然使用客户端?

2 个答案:

答案 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票:

https://java.net/jira/browse/JERSEY-2830