【问题标题】:Using PoolingHttpClientConnectionManager in EJB container在 EJB 容器中使用 PoolingHttpClientConnectionManager
【发布时间】:2014-12-04 16:15:03
【问题描述】:
  • 我们想在 Glassfish 3.1 Open 的 EJB 容器中使用 HttpClient 源版本。
  • HttpClient documentation 我们看到以下内容 关于 BasicHttpClientConnectionManager 的行:“此连接 管理器实现应在 EJB 容器内使用”。
  • PoolingHttpClientConnectionManager 文档中没有这样的行。
  • 我们可以在 EJB 容器中使用 PoolingHttpClientConnectionManager 吗?
  • 如果不是 - 您能解释一下原因吗?

【问题讨论】:

    标签: httpclient apache-httpclient-4.x apache-commons-httpclient


    【解决方案1】:

    EJB 3.1 规范禁止在 EJB 容器内运行时进行显式线程管理,这实际上使 PoolingHttpClientConnectionManager 的池功能几乎毫无用处。

    【讨论】:

    • 你确定你的答案吗?我不认为 PoolingHttpClientConnectionManager 本身做任何内部线程的创建或管理——除了用于并发 http 调用之外,池还有其他用途。
    • 我和 OP 有同样的问题——看来 PoolingHttpClientConnectionManager 更适合我的使用。我将它放在一个由多个线程调用的单例中。这些线程中的每一个都从池中获取一个连接,使用它,然后返回它。我想这样做是因为 http 调用总是针对同一台服务器,并且该服务器需要 NTLM 身份验证,并且 http 调用总是使用相同的用户凭据进行。
    • 我很确定。除了用于并发 http 调用之外,还有什么其他用途?
    • 在一个 EJB 容器中,有多个容器管理的线程同时运行。如果每个人都需要访问到同一个目标 Web 服务器的昂贵的经过身份验证的 http 连接,那么他们可以共享一个 HttpClient。这些线程中的每一个都可以从同一个 HttpClient(使用 PoolingHttpClientConnectionManager)中拉出一个连接。这些线程将从 httpClient.execute() 获得 CloseableHttpRequest 并在完成后关闭它。所以并发是存在的,它只是使用容器已经创建的线程。
    • 它与单一连接完全相同。然而,不是容器无法控制的连接池,而是由容器很好地管理的 HttpClient 实例池。但适合自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2019-09-30
    相关资源
    最近更新 更多