首页 > 解决方案 > 从线性链中的先前流中获取消息的方法

问题描述

我最近有一个如下场景:

Flow_A ------>  Flow_B ------>  Flow_C ------>  Flow_D

在哪里

所以,我想用旧消息增强标题,然后再次传递给另一个流。但是,它最终会非常笨重。

我是否应该将消息存储在某处,然后在标头中传递 messageId,以便下一个流程可以获取带有 messageId 的旧消息?

实现这一目标的最佳方法应该是什么?

标签: spring-integrationspring-integration-dsl

解决方案


请参阅声明检查模式:https ://docs.spring.io/spring-integration/docs/current/reference/html/message-transformation.html#claim-check

  1. 您使用存储消息ClaimCheckInTransformer并将其id作为输出有效负载。
  2. 您将其移动id到标题中并生成下一条消息。
  3. 重复 #1 和 #2 步骤,让第二条消息为第三条消息做好准备。
  4. 依此类推,为第四条消息准备环境。

要恢复这些消息,您需要重复相反方向的过程。将消息中的标头获取到 apayload中,将其删除并调用ClaimCheckOutTransformer以恢复存储的消息。我说“删除标题”以让堆栈正确恢复:ClaimCheckOutTransformer有这样的逻辑:

AbstractIntegrationMessageBuilder<?> responseBuilder = getMessageBuilderFactory().fromMessage(retrievedMessage);
    // headers on the 'current' message take precedence
    responseBuilder.copyHeaders(message.getHeaders());

因此,在不删除该标头的情况下,相同的消息 ID 将被带入下一步,您将成为一个循环 - StackOverflowError

另一种方法是在某处手动存储消息,例如MetadataStore并在有效负载列表中收集它们的 ID。这样您就不需要额外的逻辑来处理标题。有效载荷列表中的所有内容。您可以随时向商店咨询该列表中的任何 id 项目!


推荐阅读