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

时间:2017-05-02 05:06:22

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

我需要实现多个侦听单个队列的MDB侦听器。随着队列上的负载增加,一个侦听器不足以处理该负载。我想知道我们可以做的最好方法来实现这个目标吗?

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

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

1 个答案:

答案 0 :(得分:0)

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

onMessage

在这里我们指定,消息驱动的bean应该使用名为<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... --> 的池,它从我们系统上的CPU数量派生它的大小。您还可以指定绝对值,例如mdb-strict-max-pool

如果您在单个服务器实例上运行队列,则所有这些仅相关。如果您确实在进行消息密集型应用程序,则可能需要使用专用消息代理和多个处理实例的分布式消息传递。虽然许多服务器支持这种情况(例如Wildfly ActiveMQ集群),但这是另一个讨论的主题。

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