spring-integration - 从线性链中的先前流中获取消息的方法
问题描述
我最近有一个如下场景:
Flow_A ------> Flow_B ------> Flow_C ------> Flow_D
在哪里
- Flow_A 是发起者,应该传递 messageA。
- Flow_B 应该传递 messageA+messageB。
- Flow_C 应该通过 messageA+messageB+messageC
- Flow_D 应该传递 messageA+messageB+messageC+messageD。
所以,我想用旧消息增强标题,然后再次传递给另一个流。但是,它最终会非常笨重。
我是否应该将消息存储在某处,然后在标头中传递 messageId,以便下一个流程可以获取带有 messageId 的旧消息?
实现这一目标的最佳方法应该是什么?
解决方案
- 您使用存储消息
ClaimCheckInTransformer
并将其id
作为输出有效负载。 - 您将其移动
id
到标题中并生成下一条消息。 - 重复 #1 和 #2 步骤,让第二条消息为第三条消息做好准备。
- 依此类推,为第四条消息准备环境。
要恢复这些消息,您需要重复相反方向的过程。将消息中的标头获取到 apayload
中,将其删除并调用ClaimCheckOutTransformer
以恢复存储的消息。我说“删除标题”以让堆栈正确恢复:ClaimCheckOutTransformer
有这样的逻辑:
AbstractIntegrationMessageBuilder<?> responseBuilder = getMessageBuilderFactory().fromMessage(retrievedMessage);
// headers on the 'current' message take precedence
responseBuilder.copyHeaders(message.getHeaders());
因此,在不删除该标头的情况下,相同的消息 ID 将被带入下一步,您将成为一个循环 - StackOverflowError
。
另一种方法是在某处手动存储消息,例如MetadataStore
并在有效负载列表中收集它们的 ID。这样您就不需要额外的逻辑来处理标题。有效载荷列表中的所有内容。您可以随时向商店咨询该列表中的任何 id 项目!
推荐阅读
- assembly - 在 VirtualBox 上运行 BootSector
- reactjs - Gatsby 在 Netlify 上构建失败
- python - 类的索引成员作为python中的列表
- python - Pygame:问题源于使用键盘输入的 update() 函数
- java - 同一台机器上具有相同证书的两个服务之间的相互认证
- docker - 无法使用 nginx 直接访问 url。必须使用按钮导航到其他页面
- .net - UserPrincipal.FindByIdentity 因 System.Runtime.InteropServices.COMException (0x80005000) 失败:未知错误 (0x80005000)
- java - 数组元素不存储先前的值仅打印存储的最后一个值
- javascript - 如何读取/写入/更新日历(IOS)和谷歌日历(Android)?
- ios - 在类中设置 CoreBluetooth peripheral.delegate