java - 使用 Jersey Apache Client 4 的多线程连接管理器

标签 java multithreading apache-httpclient-4.x jersey-client

我使用 Apache Client 4 库启动并运行了 Jersey 客户端,如下所示:

private Client createClient() {
    ApacheHttpClient4Config cc = new DefaultApacheHttpClient4Config();
    // boring stuff here
    return ApacheHttpClient4.create(cc);
}

但默认情况下使用 BasicClientConnManager,它不允许多线程连接。

ApacheHttpClient4Config Javadoc 说,如果我想要多线程操作,我需要将 PROPERTY_CONNECTION_MANAGER 设置为 ThreadSafeClientConnManager 实例。我可以做到这一点,而且效果很好:

private Client createClient() {
    ApacheHttpClient4Config cc = new DefaultApacheHttpClient4Config();
    cc.getProperties().put(ApacheHttpClient4Config.PROPERTY_CONNECTION_MANAGER,
        new ThreadSafeClientConnManager());
    // boring stuff here
    return ApacheHttpClient4.create(cc);
}

但是ThreadSafeClientConnManager已被弃用。这很烦人。

更现代的版本是PoolingHttpClientConnectionManager。但不幸的是,ApacheHttpClient4.create() 方法要求连接管理器是 ClientConnectionManager 的实现(本身已弃用),而 PoolingHttpClientConnectionManager 没有实现该接口(interface)。因此,如果我尝试使用它,我的连接管理器将被忽略,我们将返回到 BasicClientConnManager

如何才能在不使用任何已弃用的内容的情况下获得线程安全的客户端?

最佳答案

您可以按如下方式创建客户端(请参阅 https://github.com/phillbarber/connection-leak-test/blob/master/src/test/java/com/github/phillbarber/connectionleak/IntegrationTestThatExaminesConnectionPoolBeforeAndAfterRun.java#L30-L33 ):

    client = new ApacheHttpClient4(new ApacheHttpClient4Handler(HttpClients.custom()
            .setConnectionManager(new PoolingHttpClientConnectionManager())
            .build(), null, false));

关于java - 使用 Jersey Apache Client 4 的多线程连接管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27167588/

相关文章:

java - 如何在Spring Boot中更改ProviderSignInController中的属性signUpUrl

java - 使用 JUnit 测试异步代码

c++ - 错误 : no match for call when calling a function by a thread

Android 9 和 Apache HTTP 的缺失

java - apache httpclient 有没有办法根据 URI 设置凭据

java - 对 CloseableHttpClient 使用 try-with-resource block 是否也会关闭返回的 CloseableHttpResponse?

java - 在 Apache Beam 中连接行

java - 用于从对象和/或 JSON 填充 HTML 模板的库

Java线程挂起而没有死锁

java - 在java中如何查看加载了imageIcon的按钮是否已被按下?