java - Spring JMS 并发和 JMSXGroupID

标签 java spring multithreading spring-jms

我在 TomEE 容器内的 Web 应用程序中使用 Spring JMS,并且我想使用 JMSXGroupID 将我的消息分组在一起。我使用以下 Spring JMS 监听器容器配置。

<jms:listener-container container-type="default" connection-factory="jmsFactory" cache="none" acknowledge="auto" transaction-manager="transactionManager" concurrency="1-5" >
    <jms:listener id="files-queue-listener" selector="mimetype ='application/xml'" destination="filesQueue" ref="filesQueueListener"/>
</jms:listener-container>

为了进行快速测试,我发送了 1000 条消息,这些消息按同一 JMSXGroupID 分组在一起。我使用 VisualVM 查看了线程,预计在整个测试期间只会看到一个监听器容器处于 Activity 状态。实际情况是,工作被分配给 5 个消息监听器容器。我检查了 ActiveMQ Web 控制台,就代理而言,消息都发送给同一个消费者。是否有任何原因导致消息在不同的消息监听器容器线程上处理?

最佳答案

首先,一些术语 - 有一个容器有 5 个消费者线程(从 ActiveMQ 的角度来看有 5 个消费者)。

我刚刚对 5 个固定消费者进行了测试,结果符合预期。

当我使用可变消费者运行时,当容器增加消费者数量时,我确实看到具有相同组 id 的消息发送到"new"消费者;然后随着消息发送到同一个(新的)消费者,它就稳定下来了。

既然ActiveMQ负责分发,那么当新的消费者被创建时,它的算法中一定有一些东西;我认为这与 Spring 没有任何关系。

更改为固定数量的消费者可能是一个可行的解决方法。

编辑

无论如何,在这里使用变量消费者可能不是一个好主意,因为当容器检测到速度减慢时,它将关闭消费者 - 这将迫使 ActiveMQ 开始为任何关联的组使用不同的消费者。

关于java - Spring JMS 并发和 JMSXGroupID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39105929/

相关文章:

c# - 停止线程直到其他完成

multithreading - 在 python 中使用 get_nowait() 而不引发空异常

java - Spring MVC 拦截器映射问题

java - 链表。头尾引用

spring - 使用 JerseyTest、Maven 和 TestNG 测试 Jersey-Spring 集成

java - 取消部署 mule 应用程序时如何停止 java 类

c++ - 选择调用似乎没有超时

java - JComboBox 选择项目后自定义显示

java - 并行实现这一点的最有效方法是什么?

Spring MVC Web 应用程序 - 从属性启用/禁用 Controller