2016-03-23 20 views
1

Yay entegrasyonunu kullanarak yönlendirme slip'i (EI Pattern) uygulamaya çalışıyorum. Yaptığım yapılandırma o routingServiceChannel ulaştığındaYönlendirme Kayma Yay Entegrasyonu (4.2)

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

Yani, daha sonra routingChannel2 ve routingChannel1 gider olduğunu. Ama benim durumumda, her zaman bir cevap kanalının olmadığı bir istisna atar. Ben

@Transformer(inputChannel = "routingServiceChannel", outputChannel=""xyzChannel) 

gibi çıkış kanalı, set Sonra sonra yönlendirme xyzChannel yerine routingChannel2 gidiyor ve routingChannel1 olur. Bahar entegrasyon çekirdeğinde kodu debug

, onlar routingSlip harita almak ve atamadan İşte sap mesajı yönteminde

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

sınıf AbstractReplyProducingMessageHandler

, bu kodla tökezledi sonuç. Bunun yerine yanıttan routingSlip yapılandırmasını alma Ve

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

, onlar RequestMessage almak çalışıyoruz. Burada bir şey eksik miyim? Ayarlamam gereken ek bir yapılandırma var mı?

cevap

0

Konuyu gördüğünüz için teşekkür ederim, BTW! :)

Her şey güzel görünüyor, ancak Yönlendirme Kayma noktasını kaçırdınız.

Her şeyden önce bu iletiyi yapılandırmanız gerekir. Yönlendirme Kayma bir header olduğundan, iletinin başlığına eklemek için HeaderEnricher kullanmalısınız.

Yönlendirme, numaralı requestMessage ürününün akış aşağısına ve tam olarak neden olur. Yönlendirme Slip HeaderEnricher dışında. Tabii ki HeaderEnricher'un requestMessage için de geçerli olabilir.

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

Not: Tam olarak HeaderEnricher sonra Slipini Yönlendirme danışmak isterseniz

, gibi bir şey yapılandırmanız gerekir kimse yeni başlık HeaderEnricher mantık boyunca kullanılabilir. Sadece aşağı yönde. Ve Yönlendirme Kayma bunlardan biridir.

+0

Teşekkürler Artem için hızlı yanıt :), aşağıdaki değişiklikleri yapacağım ve sizi güncelleyeceğim. –

+0

Teşekkürler Artem, bir çekicilik gibi çalıştı :) –