我有一些实例,我希望Spring Integration组件(服务激活器)接收带有File有效负载的消息,并产生一些输出。此外,一旦组件产生了此输出,我想将原始文件消息传递到另一个通道。
用例是我有一些文件进入,被发送到两个并行处理流(存档到S3,并解析内容)。感谢Gary Russel,我在原始文件消息上使用了发布 - 订阅频道的apply-sequence="true"
行为。当两个流都完成了一个文件时,他们应该将带有原始相关头的File消息放到一个'处理'通道上,聚合器将它们分组,当两者都聚合时,将它们放在一个为服务激活器提供服务的通道上。删除文件。
因此,总而言之,我希望服务激活器将其输出放在一个通道上,同时将收到的原始消息放到另一个通道上。
更新
与publish-subscribe
属性指定的顺序执行的订阅者同步使用order
会更好吗?
答案 0 :(得分:2)
我使用了publish-subscribe
频道,但没有指定 task-executor
,然后在每个订阅者上添加order
属性。
第一个订阅者执行其操作,并发出自己的不同输出(在我的情况下解析文件内容);我通过使用它的下游ExecutorChannel
来使这个异步的后续部分。
第二个订阅者在第一个订阅者完成之前不会执行,并获得相同的输入消息(在本例中为文件)。我让第二个订阅者Bridge
将File
推送到通道,这将导致“我已完成的事情”处理管道已准备好被删除。
答案 1 :(得分:1)
为了获得更大的灵活性,SI 2.2引入了通过建议机制向端点添加行为的功能。提供的一个标准建议是ExpressionEvaluatingRequestHandlerAdvice,它允许您根据(例如服务激活器)调用成功或失败采取不同的操作...
关联的示例应用程序显示,例如,在通过FTP发送失败后如何重命名文件,或者如果FTP操作成功,则删除它。
答案 2 :(得分:0)
在服务激活器之前使用窃听复制邮件并将其发送到另一个频道。