【发布时间】:2014-10-04 09:37:13
【问题描述】:
我在 Wildfly 8.1 (HornetQ) 上使用捆绑的 JMS 实现对大量文档进行 OCR。
我希望拥有一个由 3 个 MDB 组成的池,这些 MDB 使用一个队列的消息,其中包含要 OCRed 的文档。每个 MDB 使用 Apache commons-exec 启动一个进程并阻塞直到该进程退出。
在我的测试中,我有 50 条 JMS 消息(每条代表一个要进行 OCRed 处理的文档),它们在测试开始时加载到队列中。当处理开始时,在任何给定时间我都可以看到有 3 个 CPU 密集型 OCR 进程,每个 MDB 启动并阻止一个。在某个时间点,大约 20 分钟后,其中一个 OCR 进程消失了,在任何给定时间只有 2 个还活着。当剩余 10 条左右的 JMS 消息时,另一个 OCR 进程停止,并且在任何给定时间都只有 1 条。
最后,所有 50 个文档都已被 OCR,任何 OCR 进程或我的应用程序都没有抛出异常。
我觉得这种行为很奇怪,因为我预计在任何时间点都会有 3 个 OCR 进程在消耗 JMS 消息的时间(当然最后除外)。如果 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 {
【问题讨论】:
标签: java jms hornetq wildfly message-driven-bean