2017-05-02 47 views
1

我有一个需求来实现侦听单个队列的多个MDB侦听器。随着队列上的负载增加,一个监听器不足以处理该负载。我想知道我们可以做什么来达到这个目标的最佳方式?在同一队列上读取多个MDB侦听器

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

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

回答

0

您错过了一个关键点。它是实例化一个或多个bean来处理客户端请求的容器。整个企业bean的世界具有可扩展性作为其关键点。

基本上,你不需要做任何事情,比设计和部署你的bean。容器将完成剩下的工作。

0

如果使用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和您的服务器文件。
快乐的黑客攻击。

相关问题