2017-05-29 14 views
1

私はアプリケーションに、ある機能を実行するために特定の順序でサービスチェーンを呼び出す必要がある単純なフローを指定しています。 Springの統合とそのDSLはこのシナリオに適しているようです。チェーン内の各ハンドラに異なるエラーハンドラを割り当てる

これらの個々のサービスのいずれかがチェーンを停止すべきその時点で、(これらのサービスは、外部アプリケーションへの呼び出しです)も失敗することもできます。これだけでなく、障害の発生したサービスに応じて、制御フローも別の場所にリダイレクトする必要があります。言い換えれば、私はサービスごとに異なるエラーハンドラが必要です。

問題は、私はこれを行う方法を見つけるの困難を抱えていると、誰かが正しい方向に私を指すことができれば、私はそれを感謝くらいでしょうです。これは私がこれまで問題に取り組んできた方法です:

@Configuration 
@EnableAutoConfiguration 
@IntegrationComponentScan 
public class Application { 

public static void main(String[] args) throws InterruptedException { 
    ConfigurableApplicationContext ctx = 
      SpringApplication.run(Application.class, args); 

    System.out.println(ctx.getBean(MySource.class).send("foo")); 

    ctx.close(); 
} 

@MessagingGateway 
public interface MySource { 

    @Gateway(requestChannel = "flow.input") 
    String send(String string); 

} 

@Bean 
public IntegrationFlow flow() { 
    return f -> f 
      .handle(String.class, (i, map) -> { 
//    if (true){ 
//     throw new RuntimeException(); 
//    } 
       System.out.println(i); 
       return i + "a"; 
      }) 
      .handle(String.class, (i, map) -> { 
       System.out.println(i); 
       return i + "b"; 
      }) 
      .handle(String.class, (i, map) -> { 
       System.out.println(i); 
       return i + "c"; 
      }); 
    } 
} 

私はそれらのハンドラのそれぞれについて、エラーハンドラ/チャネルを設定することが、私は有益な何かを見つけることができませんでしたどのように検索してきました。

私はほとんど私の検索であきらめ、自分自身のコード(ため息)を書き始め、それはこのようなものになります。

public class FlowHarness { 

    public static void main(String[] args) { 
     Flow flow = FlowBuilder.flow() 
      .nextStep(i -> ((Integer)i) + 1, e -> System.out.println("failed at step 1")) 
      .nextStep(i -> ((Integer)i) + 1, e -> System.out.println("failed at step 2")) 
      .nextStep(i -> ((Integer)i) + 1, e -> System.out.println("failed at step 3")) 
      .build(); 

     flow.execute(new Integer(1)); 
    } 
} 

.nextStepの左側の引数を()ハンドラです右側の引数はエラーハンドラです。それは非常に単純ですが、私はそれがポイントを説明することを願っています。現実の流れの全てがビッグクラスで書くことができたとしても

私は独立したプライベートメソッド/クラスにサブフローのそれぞれを打破するために、より便利だろうと思います。どうもありがとう。

答えて

2

.handle()(ならびに任意の他の消費者のエンドポイント)を持つカスタム例外を使用することができますお勧めしますfailure.I上​​で実行を停止したいので:http://docs.spring.io/spring-integration/docs/4.3.9.RELEASE/reference/html/messaging-endpoints-chapter.html#expression-advice

@Bean 
public IntegrationFlow advised() { 
    return f -> f.handle((GenericHandler<String>) (payload, headers) -> { 
     if (payload.equals("good")) { 
      return null; 
     } 
     else { 
      throw new RuntimeException("some failure"); 
     } 
    }, c -> c.advice(expressionAdvice())); 
} 

@Bean 
public Advice expressionAdvice() { 
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice(); 
    advice.setSuccessChannelName("success.input"); 
    advice.setOnSuccessExpressionString("payload + ' was successful'"); 
    advice.setFailureChannelName("failure.input"); 
    advice.setOnFailureExpressionString(
      "payload + ' was bad, with reason: ' + #exception.cause.message"); 
    advice.setTrapException(true); 
    return advice; 
} 

@Bean 
public IntegrationFlow success() { 
    return f -> f.handle(System.out::println); 
} 

@Bean 
public IntegrationFlow failure() { 
    return f -> f.handle(System.out::println); 
} 
+0

を提供することができました、ありがとう – edu

0

あなたはチェーンがExpressionEvaluatingRequestHandlerAdviceを供給することができますが、適切なハンドラ

+0

質問はとにかく...これを行う方法についてのおかげでした:)アルテムは、私が欲しかっただけで何例 – edu

関連する問題