2016-10-06 6 views
0

После запуска приложения поток останавливается на routeToRecipients и другие компоненты не выполняются. (См. Встроенные комментарии в коде ниже) Произошла ошибка.Spring Integration DSL: не выполняет другие компоненты после выполнения routeToRecipients

Но когда я удаляю routeToRecipients(), выполняются другие компоненты.

Есть что-то не так с моим потоком интеграции?

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

ответ

0

Маршрутизатор не имеет выходного канала - он отправляет сообщения только получателям.

Вы можете поместить канал публикации/подписки перед маршрутизатором с маршрутизатором, являющимся одним абонентом, а оставшимся - вторым абонентом.

Или добавьте канал5 и запустите оставшийся поток (в новом потоке) с этим каналом.

+0

Спасибо, Гэри! Это действительно помогает. :) – Chinwei