我有一个在启动时Servlet
构建一个实例。HttpClient
它与服务请求时使用的协作模块共享此客户端。我想FutureRequestExecutionService
在协作模块中使用 API 来轻松地同时发送一些请求。这需要使用一个HttpClient
实例和一个ExecutorService
实例。本教程建议将 设置为使用与的最大并发连接数ExecutorService
相同的线程数。HttpClient
futureRequestExecutionService 的构造函数采用任何现有的 httpClient 实例和一个 ExecutorService 实例。配置两者时,将最大连接数与要使用的线程数保持一致很重要。当线程多于连接时,连接可能会因为没有可用连接而开始超时。当连接数多于线程数时,futureRequestExecutionService 不会使用所有连接数。
我认为协作模块应该是ExecutorService
为其并发请求创建的模块。这种情况下的问题是协作模块不一定知道它应该使用多少线程,因为它不知道HttpClient
已配置允许多少同时连接。
我知道我可以使用HttpClient
'sgetConnectionManager
方法,但从 4.3 开始,这已被弃用。那么,确定给定HttpClient
允许多少同时连接的推荐方法是什么?我怀疑错误的答案是保存对ConnectionManager
用于构建的对象的引用HttpClient
并将其与协作模块一起传递或定义某种全局常量。也许我问错了问题。
也许我应该同时创建HttpClient
、ExecutorService
和FutureRequestExecutionService
对象,然后只将
FutureRequestExecutionService
实例传递给想要使用共享客户端发出 HTTP 请求的模块。我想以与 HttpClient 作者的意图一致的方式执行此操作;在这种情况下,我只是不确定那到底是什么。
编辑:为了澄清,该HttpClient
实例是使用一个HttpClientBuilder
为其PoolingHttpClientConnectionManager
连接管理器设置的。但是,这不会发生在与 and 的创建相同的范围PoolingHttpClientConnectionManager
内FutureRequestExecutionService
。我开始怀疑它们应该一起创建,然后HttpClient
使用实例而不是传递FutureRequestExecutionService
实例。