2016-10-06 3 views
0

Lors de l'exécution de l'application, le flux s'arrête sur routeToRecipients et les autres composants n'ont pas été exécutés. (Voir les commentaires en ligne dans le code ci-dessous) Aucune erreur n'est survenue. Mais lorsque je supprime routeToRecipients(), les autres composants s'exécutent.Spring Integration DSL: ne pas exécuter d'autres composants après l'exécution de routeToRecipients

Y a-t-il un problème avec mon flux d'intégration?

@MessagingGateway 
public interface gateway { 
    @Gateway(requestChannel = "request.input") 
    void process(List<Msg> test); 
} 

@Bean(name = PollerMetadata.DEFAULT_POLLER) 
public PollerMetadata poller() { 
    return Pollers.fixedDelay(1000).get(); 
} 

@Bean 
public IntegrationFlow flow() { 
    return IntegrationFlows.from("request.input") 
      .split() 
      .channel(MessageChannels.executor(Executors.newCachedThreadPool())) 
      .transform(this.transformer::transform) 
      .routeToRecipients(r -> 
        r.recipient("channel1") 
        .recipient("channel2") 
        .recipient("channel3") 
        .recipient("channel4")) 
      .transform(this.transformer::transform2) // <---this is not executed :(
      .handle(new GenericHandler<Msg>() {  // <---this too is not executed 
       @Override 
       public Object handle(Msg payload, Map<String, Object> headers) { 
        System.out.println("test service activator!"); 
        return null; 
       } 
      }) 
      .get(); 
} 


@Bean 
public IntegrationFlow flow1() { 
    return IntegrationFlows.from("channel1") 
      .handle(new GenericHandler<Msg>() { 
       @Override 
       public Object handle(Msg payload, Map<String, Object> headers) { 
        System.out.println("Test route Channel 1") 
        return payload; 
       } 
      }) 
      .channel("output") 
      .get(); 
} 

@Bean 
public IntegrationFlow flow2() { 
    return IntegrationFlows.from("channel2") 
      .handle(new GenericHandler<Msg>() { 
       @Override 
       public Object handle(Msg payload, Map<String, Object> headers) { 
        System.out.println("Test route Channel 2") 
        return payload; 
       } 
      }) 
      .channel("output") 
      .get(); 
} 

@Bean 
public IntegrationFlow flow3() { 
    return IntegrationFlows.from("channel3") 
      .handle(new GenericHandler<Msg>() { 
       @Override 
       public Object handle(Msg payload, Map<String, Object> headers) { 
        System.out.println("Test route Channel 3") 
        return payload; 
       } 
      }) 
      .channel("output") 
      .get(); 
} 

    @Bean 
public IntegrationFlow flow4() { 
    return IntegrationFlows.from("channel4") 
      .handle(new GenericHandler<Msg>() { 
       @Override 
       public Object handle(Msg payload, Map<String, Object> headers) { 
        System.out.println("Test route Channel 4") 
        return payload; 
       } 
      }) 
      .channel("output") 
      .get(); 
} 

Répondre

0

Un routeur n'a pas de canal de sortie - il n'envoie que des messages aux destinataires.

Vous pouvez soit mettre un canal de publication/abonnement avant le routeur avec le routeur étant un abonné et les autres flux le deuxième abonné.

Ou ajoutez channel5 et démarrez le flux restant (dans un nouveau flux) avec ce canal.

+0

Merci Gary! Cela aide vraiment. :) – Chinwei