2016-03-23 7 views
1

私は、Springインテグレーションを使用してルーティングスリップ(EIパターン)を実装しようとしています。私が行っている構成はルーティングスリップスプリング統合(4.2)

@Bean 
    @Transformer(inputChannel = "routingServiceChannel") 
    public HeaderEnricher headerEnricher() { 
     return new HeaderEnricher(Collections.singletonMap(IntegrationMessageHeaderAccessor.ROUTING_SLIP, 
       new RoutingSlipHeaderValueMessageProcessor("routingChannel2",     
        "routingChannel1"))); 
    } 

であることがroutingServiceChannelに達したときに、それはroutingChannel2、その後routingChannel1に行きます。しかし、私の場合は、常に応答チャネルを持たないという例外がスローされます。

次に、routingChannel2とroutingChannel1に行くのではなく、xyzChannelにルーティングが行われます。

I春統合コアでコードをデバッグする場合、私はこのコードでつまずいたが、

クラスAbstractReplyProducingMessageHandler

protected final void handleMessageInternal(Message<?> message) { 
     Object result; 
     if (this.advisedRequestHandler == null) { 
      result = handleRequestMessage(message); 
     } else { 
      result = doInvokeAdvisedRequestHandler(message); 
     } 
     if (result != null) { 
      sendOutputs(result, message); 
     } else if (this.requiresReply) { 
      throw new ReplyRequiredException(message, "No reply produced by handler '" + getComponentName() 
        + "', and its 'requiresReply' property is set to true."); 
     } else if (logger.isDebugEnabled()) { 
      logger.debug("handler '" + this + "' produced no reply for request Message: " + message); 
     } 
    } 

ここでハンドルメッセージ法では、それらはroutingSlipマップを取得し、それを割り当てます結果。 そして

protected void produceOutput(Object reply, Message<?> requestMessage) { 
     MessageHeaders requestHeaders = requestMessage.getHeaders(); 

     Object replyChannel = null; 
     if (getOutputChannel() == null) { 
      Map<?, ?> routingSlipHeader = requestHeaders.get(IntegrationMessageHeaderAccessor.ROUTING_SLIP, Map.class); 
      if (routingSlipHeader != null) { 
       Assert.isTrue(routingSlipHeader.size() == 1, "The RoutingSlip header value must be a SingletonMap"); 
       Object key = routingSlipHeader.keySet().iterator().next(); 
       Object value = routingSlipHeader.values().iterator().next(); 
       Assert.isInstanceOf(List.class, key, "The RoutingSlip key must be List"); 
       Assert.isInstanceOf(Integer.class, value, "The RoutingSlip value must be Integer"); 
       List<?> routingSlip = (List<?>) key; 
       AtomicInteger routingSlipIndex = new AtomicInteger((Integer) value); 
       replyChannel = getOutputChannelFromRoutingSlip(reply, requestMessage, routingSlip, routingSlipIndex); 
       if (replyChannel != null) { 
        // TODO Migrate to the SF MessageBuilder 
        AbstractIntegrationMessageBuilder<?> builder = null; 
        if (reply instanceof Message) { 
         builder = this.getMessageBuilderFactory().fromMessage((Message<?>) reply); 
        } else if (reply instanceof AbstractIntegrationMessageBuilder) { 
         builder = (AbstractIntegrationMessageBuilder<?>) reply; 
        } else { 
         builder = this.getMessageBuilderFactory().withPayload(reply); 
        } 
        builder.setHeader(IntegrationMessageHeaderAccessor.ROUTING_SLIP, 
          Collections.singletonMap(routingSlip, routingSlipIndex.get())); 
        reply = builder; 
       } 
      } 

      if (replyChannel == null) { 
       replyChannel = requestHeaders.getReplyChannel(); 
      } 
     } 

     Message<?> replyMessage = createOutputMessage(reply, requestHeaders); 
     sendOutput(replyMessage, replyChannel); 
    } 

代わりの回答からroutingSlipコンフィギュレーションを取得し、彼らが要求メッセージから取得しようとしています。 ここに何か不足していますか?設定が必要なその他の設定はありますか?

答えて

0

件名にご注目いただきありがとうございます。 :)

すべてがうまく見えますが、あなたはルーティングスリップのポイントを見逃しました。

まず、メッセージ用に設定する必要があります。 Routing Slipはheaderなので、HeaderEnricherを使用してメッセージのヘッダーに追加する必要があります。

ルーティングは実際にはreplyではなく、requestMessageからのダウンストリームで発生しています。ルーティングスリップはHeaderEnricherです。

もちろん、HeaderEnricherrequestMessageで発生することがあります。

@BridgeTo 
@Bean 
public MessageChannel xyzChannel() { 
    return new DirectChannel(); 
} 

注:あなたが正確にHeaderEnricher後にスリップをルーティング相談したい場合

、あなたのような何かを設定する必要があり、誰新しいヘッダがHeaderEnricherロジック中に利用可能ではありません。川下でのみ。そしてRouting Slipもその一つです。

+0

ありがとうございました:)私は以下の変更を行い、更新します。 –

+0

ありがとうArtem、それは魅力のように働いた:) –