2017-06-29 147 views
1

Spring的@Retryable註釋將重試三次(默認)並回退到@Recovery方法。然而,@CircuitBreaker會在狀態關閉時重試一次並回退。如何在Spring中將Retryable和CircuitBreaker結合在一起?

我想結合這兩個:當斷路器的狀態是閉合的,在回退之前會重試三次(處理瞬態錯誤),如果狀態是開放的,會直接回退。

任何優雅的方式來做到這一點?一種可能的方法是在函數內部實現重試邏輯,但我覺得這不是最好的解決方案。

回答

0

@CircuitBreaker已經將@Retry實現爲stateful = true,這就是他知道有多少次調用失敗的原因。

我認爲最好的辦法在這裏,將使用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 { ... }