具有多个消息的Spring集成服务激活器

时间:2018-02-11 23:44:52

标签: spring spring-integration

我想一次处理多条消息,例如一次从通道中获取10条消息,并立即将它们写入日志文件。

鉴于这种情况,我是否可以编写一个服务激活器,它将获得预定义集合中的消息,即5或10条消息并对其进行处理?如果这不可能,那么如何使用Spring Integration实现这一目标。

2 个答案:

答案 0 :(得分:1)

这正是Aggregator所能得到的。您可以使用size() == 10之类的简单表达式向群组收集多条消息。当组完成后,DefaultAggregatingMessageGroupProcessor会发出一条消息,其中包含组中消息的有效负载列表。您可以将结果发送到服务激活器,以便立即处理批处理。

<强>更新

这样的事情:

.aggregate(aggregator -> aggregator
                        .correlationStrategy(message -> 1)
                        .releaseStrategy(group -> group.size() == 10)
                        .outputProcessor(g -> new GenericMessage<Collection<Message<?>>>(g.getMessages()))
                        .expireGroupsUponCompletion(true))

因此,我们通过静态1密钥关联消息(分组或缓冲它们)。 该组(或缓冲区大小为10),当我们到达它时,我们会发出一条消息,其中包含该组中的所有消息。在发出结果后,我们从该组清理商店,以便为新的消息序列形成一个新的商店。

答案 1 :(得分:0)

这取决于首先创建消息的内容;如果是消息驱动的通道适配器,则该适配器中的并发性是关键。

对于其他消息源,您可以使用ExecutorChannel作为服务激活器的输入通道,使用池大小为10的执行程序。

根据发送消息的内容,您需要注意在服务器发生故障时丢失消息。

如果没有关于您的申请的更多信息,很难提供一般性答案。