Spring 集成 Java DSL:如何在一个集成流中共享 header 变量 运行
Spring integration Java DSL: How to share header variable inside one integration flow run
我的流程伪代码是
@Bean
private IntegrationFlow myChannel() {
return f -> f
.enrichHeaders(h -> h.header("x", "y", true))
.split(...)
...
..handle("myHandler", "doMyWork")
...
.enrichHeaders(h -> h.header("x", "z", true))
}
首先将 header "x" 设置为值 "y"。然后消息被拆分,对于第一条消息,header 被设置为值 "z"。当第二条消息到达处理程序 myHandler
的方法 doMyWork
时,header "x" 的值为 "y"。我希望该值为 "z".
那么如何在一个集成流 运行 中共享 header 值?我希望该值仅在一个特定的集成流中共享,因为可以同时存在多个流 运行ning。
你误解了这些概念; EIP 方法只对当前消息进行操作;所有拆分消息都将继承 parent (pre-split) 消息的值,然后每条消息将在流程的后面获得 z
。
每条消息都有自己的一组 header,它们是不可变的。
您可以将 header 设置为可变值(例如 AtomicReference<String>
)——但我不建议这样做,这会使调试变得非常困难。
也许您可以在 bean 中存储一些状态,而不是尝试以这种方式使用消息 headers。
我的流程伪代码是
@Bean
private IntegrationFlow myChannel() {
return f -> f
.enrichHeaders(h -> h.header("x", "y", true))
.split(...)
...
..handle("myHandler", "doMyWork")
...
.enrichHeaders(h -> h.header("x", "z", true))
}
首先将 header "x" 设置为值 "y"。然后消息被拆分,对于第一条消息,header 被设置为值 "z"。当第二条消息到达处理程序 myHandler
的方法 doMyWork
时,header "x" 的值为 "y"。我希望该值为 "z".
那么如何在一个集成流 运行 中共享 header 值?我希望该值仅在一个特定的集成流中共享,因为可以同时存在多个流 运行ning。
你误解了这些概念; EIP 方法只对当前消息进行操作;所有拆分消息都将继承 parent (pre-split) 消息的值,然后每条消息将在流程的后面获得 z
。
每条消息都有自己的一组 header,它们是不可变的。
您可以将 header 设置为可变值(例如 AtomicReference<String>
)——但我不建议这样做,这会使调试变得非常困难。
也许您可以在 bean 中存储一些状态,而不是尝试以这种方式使用消息 headers。