iX3*_*iX3 1 java apache-httpclient-4.x
我有一个在它启动时Servlet构建一个HttpClient实例.它与服务请求时使用的协作模块共享此客户端.我想FutureRequestExecutionService在协作模块中使用API来轻松地同时发送一些请求.这需要将HttpClient实例与实例一起使用ExecutorService.本教程建议设置ExecutorService使用与HttpClient最大并发连接数相同的线程数.
futureRequestExecutionService的构造函数接受任何现有的httpClient实例和ExecutorService实例.配置两者时,必须将最大连接数与要使用的线程数对齐.当线程多于连接时,连接可能会开始超时,因为没有可用的连接.当连接多于线程时,futureRequestExecutionService将不会使用所有连接.
我认为协作模块应该是ExecutorService为其并发请求创建的模块.在这种情况下的问题是协作模块不一定知道它应该使用多少线程,因为它不知道HttpClient已配置允许多少同时连接.
我知道我可以使用HttpClient的getConnectionManager方法,但从4.3开始,这已被弃用.那么,确定给定HttpClient允许的同时连接数量的推荐方法是什么?我怀疑错误的答案是保存对ConnectionManager用于构建的对象的引用HttpClient,并将其与协作模块一起传递或定义某种全局常量.也许我问的是错误的问题.
也许我应该代替创建HttpClient,ExecutorService和FutureRequestExecutionService对象都在同一时间,然后只是通过
FutureRequestExecutionService实例来希望让使用共享客户端的HTTP请求的模块.我想以符合HttpClient作者意图的方式做到这一点; 在这种情况下,我只是不确定究竟是什么.
编辑:为了澄清,HttpClient实例是使用HttpClientBuilder具有PoolingHttpClientConnectionManager连接管理器集的实例创建的.然而,这并不在同一范围内创作的发生PoolingHttpClientConnectionManager和FutureRequestExecutionService.我开始怀疑它们应该一起创建,然后HttpClient使用FutureRequestExecutionService实例而不是传递实例.
这里的要点是避免当太多的工作线程最终争用连接太少而导致性能瓶颈的情况.每条路线/总限制的工作线程和连接数量只需要合理:例如,12个工人和10个连接或10个工人和12个连接,但不是12个工人和2个连接.
说了这么多,回答你的问题我不建议紧密耦合PoolingHttpClientConnectionManager和FutureRequestExecutionService接线代码.对我来说,一个更好的方法应该是有一个简单的POJO,甚至是一个代表HTTP服务配置的哈希映射,所有的连接代码都应该依赖于它,而不是直接耦合各种实现类.
沿着这条线的东西
static class MyHttpServiceConfig {
int workerNum = 10;
};
MyHttpServiceConfig config = new MyHttpServiceConfig();
CloseableHttpClient client = HttpClients.custom()
.setMaxConnPerRoute(config.workerNum)
.build();
ExecutorService executor = Executors.newFixedThreadPool(config.workerNum);
FutureRequestExecutionService executionService = new FutureRequestExecutionService(
client, executor);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6956 次 |
| 最近记录: |