我正在使用Spring与ActiveMQ集成。我使用maxConcurrentConsumers = 5定义了一个DefaultMessageListenerContainer。它在a中引用。在int-xml:validating-filter和int-xml:unmarshalling-transformer之后,我定义了一个队列通道actionInstructionTransformed。我有一个这个队列通道的轮询器。当我启动我的应用程序时,在ActiveMQ控制台中,我可以看到在五个会话中创建了一个连接。
现在,我有一个带有注释方法的@MessageEndpoint
@ServiceActivator(inputChannel = "actionInstructionTransformed", poller = @Poller(value = "customPoller")).
我在方法入口处有一个日志声明。每条消息的处理时间很长(几分钟)。在我的日志中,我可以看到thread-1
开始处理,然后我只能看到thread-1
输出。只有当thread-1
处理完1条消息时,我才会看到thread-2
开始处理下一条消息,等等。我的班级内没有任何同步块注释@MessageEndpoint
。我没有设法同时获得thread-1
,thread-2
等处理消息。
有没有人经历过类似的事情?
答案 0 :(得分:0)
看,你说:
在int-xml:validating-filter和int-xml:unmarshalling-transformer之后,我定义了一个队列通道actionInstructionTransformed。
现在让我们转到QueueChannel
和PollingConsumer
definitions!
另一方面,连接到实现org.springframework.messaging.PollableChannel接口(例如QueueChannel)的通道的通道适配器将生成PollingConsumer的实例。
请注意@Poller
(PollerMetadata
)有taskExecutor
选项。
默认情况下,TaskScedhuler
会根据QueueChannel
配置定期询问trigger
数据。如果PeriodicTrigger
使用fixedRate = false
之类的默认选项,那么下一次投票确实会发生在前一次投票之后。这就是为什么你只看到一个线程的原因。
因此,尝试配置taskExecutor
,来自该队列的消息将并行。
concurrency
上的DefaultMessageListenerContainer
无效。因为最后您将所有这些消息放入QueueChannel
。在这里,一个新的线程模型开始基于@Poller
配置工作。