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

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