我使用 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/