【问题标题】:Spring Integration - Forward Original Message and Reply After ProcessingSpring集成——处理后转发原始消息并回复
【发布时间】:2013-01-10 10:55:59
【问题描述】:

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

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

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

更新

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

【问题讨论】:

    标签: java spring messaging spring-integration


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      Blog post.

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

      Sample App.

      【讨论】:

      • 很遗憾,该博客文章的链接不再有效。但回购仍然有效
      【解决方案3】:

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

      【讨论】:

      • 谢谢,但我需要等待服务激活器完成后再发送原始消息。
      • 我认为没有现成的组件可以做到这一点。将 Channel 作为引用注入到您的 serviceActivator 中并以编程方式发送消息。
      猜你喜欢
      • 2018-08-25
      • 1970-01-01
      • 2021-06-09
      • 2013-03-30
      • 2020-04-05
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多