春天JMS并发的JMSXGroupID和(Spring JMS Concurrency and JM

2019-09-26 17:20发布

我在一家TomEE容器内我的web应用程序中使用Spring JMS,我想用JMSXGroupIDs到组我的信息一起。 我用下面的春天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>

对于一个快速测试,我送经的JMSXGroupID一样组合在一起1000条消息。 我看着使用VisualVM的螺纹和我期望看到在整个测试过程中只有一个监听器容器活跃。 发生了什么事是,工作是在5消息侦听容器之间的分歧。 我查了ActiveMQ的Web控制台,并尽可能的经纪人而言,这些消息都发送到相同的消费者。 有没有为什么消息将在不同的消息侦听器线程处理的原因吗?

Answer 1:

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

我只跑了5名固定的消费者测试和它的工作如预期。

当我与可变消费者跑了我没有看到与同组ID去一个“新”的消费者,当容器增加消费者数量的消息; 然后将其与消息去同一个(新的)消费稳定。

由于ActiveMQ是负责分配,它必须是在东西时,新的消费者创造了算法; 我不认为这是什么做的春天。

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

编辑

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



Answer 2:

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

1- 1 JMS会话= 1个线程,以便如果不在单个线程2-弹簧使用为侦听器容器的执行器使用另一个执行人你将被处理消息,这是配置来调谐线程模型的一个



文章来源: Spring JMS Concurrency and JMSXGroupID