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

时间:2014-11-27 09:51:53

标签: 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不实现该接口。因此,如果我尝试使用它,我的连接管理器将被忽略,我们将返回BasicClientConnManager

如何在不使用任何已弃用的东西的情况下使用线程安全的客户端?

1 个答案:

答案 0 :(得分:0)

您可以按如下方式创建客户端(请参阅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));