1

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

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

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

更新

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

4

3 回答 3

2

我使用了一个没有指定publish-subscribe的频道,然后在每个订阅者上放置一个属性。task-executororder

第一个订阅者做它的事情,并发出自己不同的输出(在我的例子中是解析的文件内容);我通过使用ExecutorChannel它的下游使这个异步的后续部分。

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

于 2013-01-10T12:41:44.010 回答
1

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

博文

例如,相关的示例应用程序展示了如何在通过 FTP 发送失败后重命名文件,或者在 FTP 操作成功时将其删除。

示例应用程序

于 2013-01-10T13:40:31.343 回答
0

在服务激活器之前使用窃听器来复制消息并将其发送到另一个通道。

于 2013-01-10T12:02:12.693 回答