Java 在同一队列上读取的多个MDB侦听器

Java 在同一队列上读取的多个MDB侦听器,java,listener,ejb-3.0,message-driven-bean,Java,Listener,Ejb 3.0,Message Driven Bean,我需要实现多个MDB侦听器来侦听单个队列。随着队列负载的增加,一个侦听器不足以处理该负载。我想知道实现这一目标的最佳途径是什么 a。我可以创建类似的MDB类并将它们部署到WebSphereServer上。 B使用任何配置的任何其他方式 请提供正确的方法,好像可以动态配置侦听器并在需要时启用它们,或者只有一个方法点(a)可以实现这一点?您缺少一个关键点。它是实例化一个或多个bean以处理客户端请求的容器。企业bean的整个世界都将可伸缩性作为其关键点 基本上,除了设计和部署bean之外,您不需要做

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

a。我可以创建类似的MDB类并将它们部署到WebSphereServer上。 B使用任何配置的任何其他方式


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

您缺少一个关键点。它是实例化一个或多个bean以处理客户端请求的容器。企业bean的整个世界都将可伸缩性作为其关键点


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

您缺少一个关键点。它是实例化一个或多个bean以处理客户端请求的容器。企业bean的整个世界都将可伸缩性作为其关键点


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

如果您使用JEE规范中定义的MDB使用
@MessageDriven
注释,那么服务器容器将负责管理这些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集群),但这确实是另一个讨论的主题

有关更多信息,请查看和您的服务器文档。

愉快的黑客行为。

如果您使用JEE规范中定义的MDB,并使用
@MessageDriven
注释,那么服务器容器将负责管理这些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集群),但这确实是另一个讨论的主题

有关更多信息,请查看和您的服务器文档。
快乐黑客