Интеграция 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".

Итак, как разделить значение заголовка внутри одного запуска потока интеграции? Я хочу, чтобы это значение использовалось только в одном конкретном потоке интеграции, потому что одновременно может выполняться несколько потоков.


person Mike    schedule 10.01.2019    source источник


Ответы (1)


Вы неправильно понимаете концепции; Методы EIP работают только с текущим сообщением; все разделенные сообщения наследуют значение от родительского (предварительно разделенного) сообщения, каждое сообщение затем получит z позже в потоке.

Каждое сообщение получает свой собственный набор неизменяемых заголовков.

Вы можете сделать заголовок изменяемым значением (например, AtomicReference<String>), но я бы не советовал этого делать, это сильно затруднит отладку.

Возможно, вы могли бы сохранить какое-то состояние в bean-компоненте вместо того, чтобы пытаться таким образом использовать заголовки сообщений.

person Gary Russell    schedule 10.01.2019