我使用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
。
如何在不使用任何已弃用的东西的情况下使用线程安全的客户端?
答案 0 :(得分:0)
client = new ApacheHttpClient4(new ApacheHttpClient4Handler(HttpClients.custom()
.setConnectionManager(new PoolingHttpClientConnectionManager())
.build(), null, false));