Spring Integration Java DSL - 流程中的可重用对象

时间:2017-08-28 10:45:13

标签: java spring-integration dsl spring-integration-dsl

我是Spring Integration DSL的新手,我遇到了问题。我需要在subFlow中的特定点或流中的任何其他点从流的开头使用Object,类似于在整个流程中可重用的Session变量。下面是我转换udp请求的示例,将其转换为发送到api函数的http请求,并且接收到的响应不包含进行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();
}

1 个答案:

答案 0 :(得分:3)

解决了它,使用了 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();
}