2016-10-06 13 views
0

アプリケーションの実行時に、routeToRecipientsでフローが停止し、他のコンポーネントは実行されませんでした。 (下のコードのインラインコメントを参照してください) エラーは発生しません。Spring統合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

ルータには出力チャネルがありません。受信者にのみメッセージを送信します。

パブリッシュ/サブスクライブチャネルをルータの前に配置し、ルータを1つのサブスクライバとし、残りのチャネルを第2のサブスクライバにすることができます。

または、channel5を追加し、そのチャネルで(新しいフローで)残りのフローを開始します。

+0

ありがとうございました!これは本当に役立ちます。 :) – Chinwei

関連する問題