Wildfly JMS:当消息存在时,MDB bean空闲

时间:2014-08-11 14:08:45

标签: java jms hornetq wildfly message-driven-bean

我在Wildfly 8.1(HornetQ)上使用捆绑的JMS实现来OCR大量文档。

我希望有一个包含3个MDB的池,这些MDB使用要被OCR的文档的Queue消息。每个MDB都使用Apache commons-exec启动一个进程并阻塞,直到该进程退出。

在我的测试中,我有50条JMS消息(每条消息代表一个要被OCR的文档),它们在测试开始时加载到队列中。处理开始时,在任何给定时间我都可以看到有3个CPU密集型OCR进程,一个由每个MDB启动和阻止。在某些时候,在20分钟左右之后,其中一个OCR过程消失,并且在任何给定时间只有2个保持活着。当剩下10条JMS消息时,另一个OCR进程停止,并且在任何给定时间只有1条。

最后,所有50个文档都已被OCR,并且任何OCR进程或我的应用程序都不会抛出任何异常。

我发现这种行为很奇怪,因为我希望在任何时间消耗JMS消息时都会有3个OCR进程处于活动状态(当然除外)。如果在队列中输入时将JMS消息“分配”到MDB实例,而不是实时,则可以解释此行为。例如,如果为每个MDB分配了大约17条消息。根据文档大小,当其他MDB实例仍然可以使用消息时,某些MDB实例可以提前完成并保持空闲而不消耗任何其他消息。

这是发生了什么事吗?如果是,是否有办法更改此设置,以便每当MDB实例完成处理消息时都会向MDB实例分配消息?

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "queue/csrOcrQueue"),
        @ActivationConfigProperty(propertyName = "minSession", propertyValue = "3"),
        @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "3")
})
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class OcrMessageListener implements MessageListener {

1 个答案:

答案 0 :(得分:1)

这与客户端(MDB)上的JMS消息缓冲有关。默认情况下,将启用消息缓冲以避免网络延迟。但是,对于我的客户速度慢的情况,这不是问题。

这来自HornetQ documentation

  

<强> 39年1月11日。没有消费者缓冲

     

默认情况下,HornetQ消费者缓冲来自服务器的消息   客户端缓冲区,然后在客户端上实际接收它们   侧。这样可以提高性能,因为每次打电话都会提   receive()或已处理MessageListener中的最后一条消息   onMessage()方法,HornetQ客户端必须去服务器   请求下一条消息,然后将其发送给客户端   一方面,如果有的话。

     

这将涉及每个消息的网络往返并减少   性能。因此,默认情况下,HornetQ预先获取消息   每个消费者的缓冲区。

     

在某些情况下,缓冲是不可取的,HornetQ允许它   关掉了。这个例子证明了这一点。

Github中有一个示例项目作为文档的一部分,其中关闭了消费者缓冲:link

相关问题