Spring Integration Java DSL - многоразовый объект в потоке

Я новичок в Spring Integration DSL, и у меня возникла проблема. Мне нужно использовать Object с начала потока в определенной точке в subFlow или в любой другой точке потока, что-то вроде переменной Session, которую можно повторно использовать во всем потоке. Вот пример, в котором я преобразовываю запрос udp, преобразую его в запрос http, который отправляется в функцию api, а полученный ответ не содержит данных, необходимых для ответа udp. Итак, мне каким-то образом нужны данные, которые находятся в запросе udp, чтобы сделать ответ udp. Я думал о сплиттере, но не думаю, что это решение или даже расширение текущего потока Integratin для моих нужд. Я знаю, что система не является слабосвязанной, но это должен быть способ сделать это.

@Bean
public IntegrationFlow udpHttpFlow() {
    return IntegrationFlows.from(udpInboundChannel())
            .transform(udpRequestTransformer())
            /* udp request object to use */
            .<UdpRequest, Boolean>route(SessionObject::sessionExists, mapping -> mapping
                    .subFlowMapping(false, sf -> sf
                            .transform(httpRequestTransformer())
                            .handle(httpOutboundGateway())
                            .transform(httpResponseTransformer()))
                            /*use udp object here .handle(...) */
                    .subFlowMapping(true, sf -> sf
                        /* .handle(...) */
            .transform(udpResponseTransformer())
            .handle(udpOutboundChannel())
            .get();
}

person Stevan    schedule 28.08.2017    source источник


Ответы (1)


Решил, использовал метод enrichHeaders.

@Bean
public IntegrationFlow udpHttpFlow() {
    return IntegrationFlows.from(udpInboundChannel())
            .transform(udpRequestTransformer())
            /* save udb request object to message header */
            .enrichHeaders(s -> s.headerExpressions(h -> h.put("udp", "payload")))
            .<UdpRequest, Boolean>route(SessionObject::sessionExists, mapping -> mapping
                    .subFlowMapping(false, sf -> sf
                            .transform(httpRequestTransformer())
                            .handle(httpOutboundGateway())
                            .transform(httpResponseTransformer())
                            /* an example how to use the udp request object */
                            .handle((payload, headers) -> headers.get("udp")))
                    .subFlowMapping(true, sf -> sf
                        /* .handle(...) */
            .transform(udpResponseTransformer())
            .handle(udpOutboundChannel())
            .get();
}
person Stevan    schedule 28.08.2017