Spring 集成 Java DSL - 流程中的可重用对象
Spring Integration Java DSL - Reusable object in the flow
我是 Spring 集成 DSL 的新手,我遇到了一个问题。我需要在子流中的特定点或流中的任何其他点上从流的开始使用 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();
}
解决了,用了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();
}
我是 Spring 集成 DSL 的新手,我遇到了一个问题。我需要在子流中的特定点或流中的任何其他点上从流的开始使用 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();
}
解决了,用了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();
}