2017-08-28 82 views
1

我是Spring Integration DSL的新手,我遇到了一個問題。我需要在子流中的特定點或流中的任何其他點使用Object的流開始,就像在整個流中可重用的Session變量。以下是我轉換udp請求的示例,將它轉換爲發送到api函數的http請求,並且接收到的響應不包含進行udp響應所需的數據。所以不知何故,我需要udp請求中的數據來製作udp響應。我一直在考慮拆分器,但我不認爲這是一個解決方案,甚至不能將當前的Integratin流程擴展到我的需求。我知道這個系統不是鬆散耦合的,但它必須是一種方法。Spring集成Java DSL - 流中的可重用對象

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

回答

2

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