gpt4 book ai didi

ejb - 如何在 TomEE 的 EJB 中使用 HTTPClient

转载 作者:行者123 更新时间:2023-12-04 18:02:07 26 4
gpt4 key购买 nike

我有一个 EJB3 bean 需要从多个 HTTP 服务器进行 GET 或 POST。我已经阅读了关于编写 JCA 适配器的文档,以及关于 Apache HTTPComponents 的文档,特别是 HTTPClient 提供的托管连接、托管连接工厂等。

我注意到 BasicHttpClientConnectionManager 的文档说要使用它,而不是 PoolingHttpClientConnectionManager “在 EJB 容器内部。”目前尚不清楚“EJB 容器内部”是指要在容器中运行的 EJB 中的用户代码,还是指容器自己的实现代码(例如,您可能放入 JCA 适配器中的代码)。

在架构上,我仍然有点不清楚如何处理任务以最大限度地利用容器提供的服务。到目前为止,我的选择似乎是:

  1. 在 EJB 中,创建一个新的 BasicHttpClientConnectionManager,然后创建一个客户端,如下所示:

        BasicHttpClientConnectionManager cxMgr = new BasicHttpClientConnectionManager()    HttpClients.custom().setConnectionManager(cxMgr).build()

    我相信,这会导致没有连接池,而是 EJB 实例池,这可能不是所有的性能,因为 EJB 容器无法知道哪个 bean 实例持有到哪个远程的事件连接HTTP 服务器。

  2. 编写一个(相当小的)JCA 适配器来包装 PoolingHttpClientConnectionManager,然后在 EJB 中使用 @Resource 注释获取该适配器并使用它来构建 HTTPClient

  3. 编写一个 JCA 适配器来管理 HTTPClients 池并在需要时分发它们。

我不清楚我应该采用哪种方法,或者我是否忽略了容器中已经内置的某种 HTTP 连接管理服务(在本例中为 TomEE plus)。我应该怎么做?

最佳答案

事情没那么简单:这些选项都不匹配。具体答案取决于 HTTP 连接的远程端是否是单个资源。

如果是单个逻辑资源,则 JCA 最匹配。不过,您几乎不应该在适配器中避免任何对其 HTTP 特性的引用:为您的远程系统设计一个适当的逻辑接口(interface),然后在该接口(interface)上实现一个资源适配器。您的客户请求他们需要的数据,然后不是以 HTML 字符串的形式接收它,而是以随时可用的 Java bean 的形式接收它。您将能够利用 EJB 容器提供的许多优势,而不会违反需求。

如果您需要一个入口点来访问未指定数量的外部服务(HTML 页面搜索索引可能就是这类工作),那么事情就变得棘手了。 JCA 不打算用于这类事情,但它非常适合它们:我正在维护 TCP SocketConnector 项目,它的功能几乎相同,而且一切都很好用。 EJB 不适合这里:无状态 bean 池很难控制,单例需要您自己编写非阻塞池实现,而有状态是单线程的。

还有一个额外的选择:虽然 JCA 可以更容易地集成到您现有的 Java EE 环境中,但如果您是第一次使用,可能很难从头开始实现资源适配器。与 JMS 队列连接的外部 HTTP 查询工具在这里可能会派上用场。 JMS 将使平衡工作负载变得更加容易,但它会消除任何交互性并可能减慢整个链条的速度。

附言对于原始问题的第三个选项:不需要在 JCA 中实现池,因为默认情况下容器已经为所有资源适配器实例维护连接池。只需为每个 JCA 的 ManagedConnection 保留一个 HTTP 客户端连接,一切都将开箱即用。

关于ejb - 如何在 TomEE 的 EJB 中使用 HTTPClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com