首页 > 解决方案 > Spring集成Java DSL:如何在一个集成流运行中共享标头变量

问题描述

我的流程的伪代码是

    @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))
}

首先,标题“x”设置为值“y”。然后消息被拆分,并且对于第一条消息,标头设置为值“z”。当第二条消息到达doMyWork处理程序myHandler的方法时,标头“x”的值为“y”。我希望该值为“z”。

那么如何在一个集成流运行中共享标头值呢?我希望该值仅在一个特定的集成流中共享,因为可以同时运行多个流。

标签: spring-integrationspring-integration-dsl

解决方案


您误解了这些概念;EIP方法只对当前消息进行操作;所有拆分消息都将继承父(拆分前)消息的值,然后每个消息将z在流中稍后获得。

每条消息都有自己的一组标头,这些标头是不可变的。

您可以使标头成为可变值(例如AtomicReference<String>)-但我不建议这样做,这会使调试变得非常困难。

也许您可以在 bean 中存储一些状态,而不是尝试以这种方式使用消息头。


推荐阅读