2016-08-23 82 views
0

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

<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查看了线程,我期望在整个测试过程中只能看到一个侦听器容器处于活动状态。发生的事情是,这个工作是在5个消息监听器容器之间分配的。我检查了ActiveMQ Web控制台,就代理而言,这些消息都发送给同一个用户。为什么消息将在不同的消息监听器容器线程上处理?是否有任何理由?

回答

1

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

我刚刚对5位固定用户进行了测试,它按预期工作。

当我使用变量消费者运行时,当容器增加了消费者数量时,我确实看到具有相同组ID的消息传递给“新”消费者;它随着消息传递给同一个(新)消费者而稳定下来。

由于ActiveMQ负责分发,因此创建新消费者时,它必须是其算法中的某些内容;我认为这与Spring没有任何关系。

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

编辑

使用变量这里的消费者可能不是一个好主意,反正因为当容器检测慢下来,它将会终止消费者 - 这将迫使ActiveMQ的开始使用一个不同的消费者对任何关联的群组。

+0

另请参阅我的编辑。 –

+0

我试图将它改为5,问题仍然是一样的。 – Animal2

+0

你确定你正确设置标题吗?它每次都适合我。查看调试器中的入站消息以确保头文件已设置。 'ActiveMQTextMessage {commandId = 15,... groupID = foo,... text = foo}' –

0

一些更多的输入(从tomee邮件列表复制,因为它不会被自动链接):

1 1个JMS会话= 1个线程,所以如果你不使用其他执行人您要处理的消息单线程 2-弹簧使用侦听器容器的执行器,这是一个配置来调整线程模型