从线性链中的前一个流中获取信息的方法。

问题描述 投票:1回答:1

我最近遇到了一个类似下面的情况。

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

哪里

  • Flow_A是发起者,应该传递消息A。
  • Flow_B 应该传递 messageA+messageB。
  • Flow_C应该传递消息A+消息B+消息C。
  • Flow_D应该传递消息A+消息B+消息C+消息D。

所以,我在想用一个旧的消息增强头,再传给另一个流。但是,到最后会很笨重。

我是否应该将消息存储在某个地方,然后在头中传递消息ID,这样下一个流就可以得到带有消息ID的旧消息?

应该用什么方法来实现呢?

spring-integration spring-integration-dsl
1个回答
1
投票

参见索赔检查模式。https:/docs.spring.iospring-integrationdocscurrentreferencehtmlmessage-transformation.html#claim-check

  1. 您可以使用 ClaimCheckInTransformer 而得其 id 作为输出有效载荷。
  2. 你把这个 id 到头,并产生下一个消息。
  3. 重复#1和#2的步骤,为第二条消息做好准备,为第三条消息做好准备。
  4. 以此类推,为第四条消息准备环境。

要恢复这些消息,你需要重复相反的过程。payload移除它,并调用 ClaimCheckOutTransformer 来恢复存储的消息。我说 "删除头 "是为了让堆栈能够正确地恢复到:的。ClaimCheckOutTransformer 有一个这样的逻辑。

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

所以,如果不去掉那个头,同样的信息ID就会被带入下一步,而你将会是一个循环 - StackOverflowError.

另一种是手动将消息存储在某个地方,比如说。MetadataStore 并在有效载荷列表中收集它们的id。这样你就不需要额外的逻辑来处理报头。一切都在你的有效载荷列表中。你可以在任何时候查询存储在该列表中的任何id项!

© www.soinside.com 2019 - 2024. All rights reserved.