【发布时间】:2015-11-04 18:38:21
【问题描述】:
我有一个 EJB3 bean,它需要从多个 HTTP 服务器进行 GET 或 POST。我已经阅读了有关编写 JCA 适配器的文档,以及有关 Apache HTTPComponents 的文档,特别是 HTTPClient 提供的托管连接、托管连接工厂等。
我注意到BasicHttpClientConnectionManager 的文档说要使用它,而不是PoolingHttpClientConnectionManager“EJB 容器内部”。目前尚不清楚“EJB 容器内部”是指要在容器中运行的 EJB 中的用户代码,还是容器自己的实现代码(例如,您可能放入 JCA 适配器中的内容。
我仍然有点不清楚,在架构上,如何处理任务以最大限度地利用容器提供的服务。到目前为止,我的选择似乎是:
-
在 EJB 中,创建一个新的 BasicHttpClientConnectionManager,然后创建一个客户端,如下所示:
BasicHttpClientConnectionManager cxMgr = new BasicHttpClientConnectionManager() HttpClients.custom().setConnectionManager(cxMgr).build()我相信,这将导致没有连接池,而是 EJB 实例池,这可能不会那么高效,因为 EJB 容器无法知道哪个 bean 实例持有与哪个远程的活动连接HTTP 服务器。
编写一个(相当小的)JCA 适配器来包装 PoolingHttpClientConnectionManager,然后在 EJB 中,使用 @Resource 注释获取该适配器并使用它来构建 HTTPClient
编写一个 JCA 适配器来管理 HTTPClients 池并在需要时分发它们。
我不清楚我应该采用哪种方法,或者我是否忽略了某种已经内置在容器中的 HTTP 连接管理服务(在本例中为 TomEE plus)。我该怎么做?
【问题讨论】:
-
我在 EJB 中直接使用了 PoolingHttpClientConnectionManager(没有 JCA 适配器),但那是一个单例(我们使用的是 ejb-3.1)并且连接数相当固定
标签: ejb ejb-3.0 apache-httpclient-4.x apache-tomee jca