我想一次处理多条消息,例如一次从通道中获取10条消息,并立即将它们写入日志文件。
鉴于这种情况,我是否可以编写一个服务激活器,它将获得预定义集合中的消息,即5或10条消息并对其进行处理?如果这不可能,那么如何使用Spring Integration实现这一目标。
答案 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的执行程序。
根据发送消息的内容,您需要注意在服务器发生故障时丢失消息。
如果没有关于您的申请的更多信息,很难提供一般性答案。