【问题标题】:multiple MDB listeners reading on same queue多个 MDB 侦听器在同一队列上读取
【发布时间】:2017-05-02 05:06:22
【问题描述】:

我需要实现多个侦听单个队列的 MDB 侦听器。随着队列负载的增加,一个侦听器不足以处理该负载。我想知道实现这一目标的最佳方法是什么?

一个。我可以创建类似的 MDB 类并将它们部署在 websphere 服务器上。 湾。任何其他方式使用任何配置?

您能否提供正确的方法,好像可以动态配置侦听器并在需要时启用它们,或者只有一个方式点 (a) 可以实现这一点?

【问题讨论】:

    标签: java listener ejb-3.0 message-driven-bean


    【解决方案1】:

    你错过了一个关键点。它是实例化一个或多个 bean 以处理客户请求的容器。整个企业 bean 的世界都以可扩展性为重点。

    基本上,除了设计和部署 bean 之外,您不需要做任何其他事情。容器将完成剩下的工作。

    【讨论】:

      【解决方案2】:

      如果您使用 JEE 规范中使用 @MessageDriven 注释定义的 MDB,则由服务器容器来管理这些 bean 的实际实例化和缩放。我对 Websphere 不是很熟悉,但是大多数服务器都有 EJB 池的概念,它大致转换为线程池——让您开箱即用地并行执行。这样,服务器就有一组实例准备好处理队列中的消息。每个 bean 实例只会在执行其onMessage 方法所需的时间内处于活动状态,之后它将被清理并返回到队列中。假设您有一个 MDB 池,大小为 20。如果队列中等待的消息超过 20 条,那么服务器将用完所有可用实例并同时处理 20 条消息。
      例如,在 Wildfly/JBoss 中,您可以使用 EJB 子系统和相应的池设置来管理 EJB 池。

      <subsystem xmlns="urn:jboss:domain:ejb3:4.0">
          <!--omitted for brevity... -->
          <mdb>
             <resource-adapter-ref resource-adapter-name="${ejb.resource-adapter-name:activemq-ra.rar}"/>
             <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
          </mdb>
          <pools>
             <bean-instance-pools>
                <strict-max-pool name="mdb-strict-max-pool" derive-size="from-cpu-count" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
              </bean-instance-pools>
           </pools>
           <!--omitted for brevity... -->
      

      这里我们指定,消息驱动的 bean 应该使用一个名为 mdb-strict-max-pool 的池,该池的大小来自我们系统上的 CPU 数量。您还可以指定绝对值,例如max-pool-size="20"

      如果您在单个服务器实例上运行队列,所有这些都是相关的。如果您真的在做一个消息密集型应用程序,那么您很可能需要一个分布式消息传递,具有专用的消息代理和多个处理实例。虽然许多服务器都支持这样的场景(例如 Wildfly ActiveMQ 集群),但它确实是另一个讨论的话题。

      有关更多信息,请查看 MDB tutorial 和您的服务器文档。
      愉快的黑客攻击。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-18
        • 2017-10-29
        • 2018-04-08
        • 1970-01-01
        • 2013-09-24
        • 2016-12-31
        • 1970-01-01
        • 2021-09-17
        相关资源
        最近更新 更多