Spring集成 - 处理后转发原始消息和回复

时间:2013-01-10 10:56:00

标签: java spring messaging spring-integration

我有一些实例,我希望Spring Integration组件(服务激活器)接收带有File有效负载的消息,并产生一些输出。此外,一旦组件产生了此输出,我想将原始文件消息传递到另一个通道。

用例是我有一些文件进入,被发送到两个并行处理流(存档到S3,并解析内容)。感谢Gary Russel,我在原始文件消息上使用了发布 - 订阅频道的apply-sequence="true"行为。当两个流都完成了一个文件时,他们应该将带有原始相关头的File消息放到一个'处理'通道上,聚合器将它们分组,当两者都聚合时,将它们放在一个为服务激活器提供服务的通道上。删除文件。

因此,总而言之,我希望服务激活器将其输出放在一个通道上,同时将收到的原始消息放到另一个通道上。

更新

publish-subscribe属性指定的顺序执行的订阅者同步使用order会更好吗?

3 个答案:

答案 0 :(得分:2)

我使用了publish-subscribe频道,但没有指定 task-executor,然后在每个订阅者上添加order属性。

第一个订阅者执行其操作,并发出自己的不同输出(在我的情况下解析文件内容);我通过使用它的下游ExecutorChannel来使这个异步的后续部分。

第二个订阅者在第一个订阅者完成之前不会执行,并获得相同的输入消息(在本例中为文件)。我让第二个订阅者BridgeFile推送到通道,这将导致“我已完成的事情”处理管道已准备好被删除。

答案 1 :(得分:1)

为了获得更大的灵活性,SI 2.2引入了通过建议机制向端点添加行为的功能。提供的一个标准建议是ExpressionEvaluatingRequestHandlerAdvice,它允许您根据(例如服务激活器)调用成功或失败采取不同的操作...

Blog post

关联的示例应用程序显示,例如,在通过FTP发送失败后如何重命名文件,或者如果FTP操作成功,则删除它。

Sample App

答案 2 :(得分:0)

在服务激活器之前使用窃听复制邮件并将其发送到另一个频道。