2017-06-29 23 views
1

Springの@Retryableアノテーションは、3回(デフォルト)再試行され、@Recoveryメソッドにフォールバックします。しかし、@CircuitBreakerは一度再試行し、状態が終了するとフォールバックします。私は、これら2つの組み合わせたいSpringでRetryableとCircuitBreakerを組み合わせる方法は?

:回路ブレーカの状態を閉じたときに、(一時的なエラーに対処するために)戻って落ちる前に3回再試行しますが、状態が開いている場合は、直接フォールバックします。

これを行うにはどのようなエレガントな方法ですか?可能なアプローチは、関数内にリトライロジックを実装することですが、最適な解決策ではないと感じています。

答えて

0

@CircuitBreakerはすでに真=ステートフルとして@Retryを実装し、それは彼が呼び出しが失敗したどのように多くの知っている方法です。

私は、ここに最善の方法を考えて、あなたのメソッド内RetryTemplateを使用することになります。

@CircuitBreaker(maxAttempts = 2, openTimeout = 5000l, resetTimeout = 10000l) 
void call() { 
    retryTemplate.execute(new RetryCallback<Void, RuntimeException>() { 
    @Override 
    public Void doWithRetry(RetryContext context) { 
     myService.templateRetryService(); 
    } 
    }); 
} 

RetryTemplateの宣言:プロジェクト内の春の再試行を有効にする

@Configuration 
public class AppConfig { 

    @Bean 
    public RetryTemplate retryTemplate() { 
     RetryTemplate retryTemplate = new RetryTemplate(); 

     FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); 
     fixedBackOffPolicy.setBackOffPeriod(2000l); 
     retryTemplate.setBackOffPolicy(fixedBackOffPolicy); 

     SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
     retryPolicy.setMaxAttempts(2); 
     retryTemplate.setRetryPolicy(retryPolicy); 

     return retryTemplate; 
    } 
} 

@Configuration 
@EnableRetry 
public class AppConfig { ... } 
関連する問題