Spring Integration多个不同时处理的消费者

时间:2017-01-18 14:14:37

标签: concurrency spring-integration spring-jms

我正在使用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-1thread-2等处理消息。

有没有人经历过类似的事情?

1 个答案:

答案 0 :(得分:0)

看,你说:

  

在int-xml:validating-filter和int-xml:unmarshalling-transformer之后,我定义了一个队列通道actionInstructionTransformed。

现在让我们转到QueueChannelPollingConsumer definitions

  

另一方面,连接到实现org.springframework.messaging.PollableChannel接口(例如QueueChannel)的通道的通道适配器将生成PollingConsumer的实例。

请注意@PollerPollerMetadata)有taskExecutor选项。

默认情况下,TaskScedhuler会根据QueueChannel配置定期询问trigger数据。如果PeriodicTrigger使用fixedRate = false之类的默认选项,那么下一次投票确实会发生在前一次投票之后。这就是为什么你只看到一个线程的原因。

因此,尝试配置taskExecutor,来自该队列的消息将并行。

concurrency上的DefaultMessageListenerContainer无效。因为最后您将所有这些消息放入QueueChannel。在这里,一个新的线程模型开始基于@Poller配置工作。