SpringCloud--異常重試框架(十七)

一Spring-retry簡(jiǎn)介

??有些場(chǎng)景需要我們對(duì)一些異常情況下面的任務(wù)進(jìn)行重試,比如:調(diào)用遠(yuǎn)程的RPC服務(wù),可能由于網(wǎng)絡(luò)抖動(dòng)出現(xiàn)第一次調(diào)用失敗,嘗試幾次就可以恢復(fù)正常。
??spring-retry是spring提供的一個(gè)基于spring的重試框架,非常好用。
官網(wǎng)地址: https://github.com/spring-projects/spring-retry

二、Maven依賴(lài)

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

三、重試使用

  1. 啟動(dòng)類(lèi)添加注解@EnableRetry
@SpringBootApplication
@EnableTransactionManagement // 啟注解事務(wù)管理
@EnableScheduling
@EnableRetry  // 啟用了重試功能
public class TestWebApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestWebApplication.class, args);
    }
}

  1. 業(yè)務(wù)方法重試
@Service
@Slf4j
public class RetryServiceImpl implements RetryService {
    private AtomicInteger count = new AtomicInteger(1);
 
    @Override
    @Retryable(value = { RemoteAccessException.class }, maxAttemptsExpression = "${retry.maxAttempts:10}",
            backoff = @Backoff(delayExpression = "${retry.backoff:1000}"))
    public void retry() {
        log.info("start to retry : " + count.getAndIncrement());
 
        throw new RemoteAccessException("here " + count.get());
    }
 
    @Recover
    public void recover(RemoteAccessException t) {
        log.info("SampleRetryService.recover:{}", t.getClass().getName());
    }        
} 

【注意】@Recover 的用法。它要求它注釋的方法的返回值必須和@Retryable的注釋的方法返回值保持一致,否則@Recover 注釋的方法不會(huì)被調(diào)用。它還有關(guān)于自己參數(shù)的使用要求。

  1. 自定義retry
    public static void main(String[] args) throws InterruptedException {
        RetryTemplate template = new RetryTemplate();
 
        TimeoutRetryPolicy policy = new TimeoutRetryPolicy();
        policy.setTimeout(2000L);

        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);
        
        // 重試策略
        template.setRetryPolicy(retryPolicy);
 
        String result = template.execute(context -> {
 
            System.out.println("TestAll.main()1");
            TimeUnit.SECONDS.sleep(1L);
            throw new IllegalArgumentException();
        }, context -> {
            System.out.println("TestAll.main()2");
            return "world";
        });
        System.out.println("result:" + result);
 
    }

【注意】
interface RetryPolicy 它有很多的實(shí)現(xiàn)類(lèi)可以使用。

四、常用注解

  1. @Retryable注解
    被注解的方法發(fā)生異常時(shí)會(huì)重試
    value:指定發(fā)生的異常進(jìn)行重試
    include:和value一樣,默認(rèn)空,當(dāng)exclude也為空時(shí),所有異常都重試
    exclude:指定異常不重試,默認(rèn)空,當(dāng)include也為空時(shí),所有異常都重試
    maxAttemps:重試次數(shù),默認(rèn)3
    backoff:重試補(bǔ)償機(jī)制,默認(rèn)沒(méi)有
  2. @Backoff注解
    delay:指定延遲后重試
    multiplier:指定延遲的倍數(shù),比如delay=5000l,multiplier=2時(shí),第一次重試為5秒后,第二次為10秒,第三次為20秒
  3. @Recover
    當(dāng)重試到達(dá)指定次數(shù)時(shí),被注解的方法將被回調(diào),可以在該方法中進(jìn)行日志處理。需要注意的是發(fā)生的異常和入?yún)㈩?lèi)型一致時(shí)才會(huì)回調(diào)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 分布式環(huán)境下,重試是高可用技術(shù)中的一個(gè)部分,大家在調(diào)用RPC接口或者發(fā)送MQ時(shí),針對(duì)可能會(huì)出現(xiàn)網(wǎng)絡(luò)抖動(dòng)請(qǐng)求超...
    夢(mèng)想又照進(jìn)現(xiàn)實(shí)閱讀 2,251評(píng)論 0 2
  • 說(shuō)明 最近公司在搞活動(dòng),需要依賴(lài)一個(gè)第三方接口,測(cè)試階段并沒(méi)有什么異常狀況,但上線后發(fā)現(xiàn)依賴(lài)的接口有時(shí)候會(huì)因?yàn)閮?nèi)部...
    kakukeme閱讀 956評(píng)論 1 49
  • 1. 說(shuō)明 最近公司在搞活動(dòng),需要依賴(lài)一個(gè)第三方接口,測(cè)試階段并沒(méi)有什么異常狀況,但上線后發(fā)現(xiàn)依賴(lài)的接口有時(shí)候會(huì)因...
    Java_Explorer閱讀 1,180評(píng)論 0 0
  • 準(zhǔn)備好好看看一下spring-cloud的源碼,把其中實(shí)現(xiàn)的原理搞清楚,而不是僅僅會(huì)配幾個(gè)注解,會(huì)配幾個(gè)參數(shù),把“...
    沉寂之舟閱讀 14,928評(píng)論 0 6
  • 這周是我重新回醫(yī)院上班的第一周 也是親公親婆獨(dú)自帶貝勒爺?shù)牡谝恢?大家都是開(kāi)始著新的生活節(jié)奏 早上要早起 貝勒爺會(huì)...
    COCOcby閱讀 288評(píng)論 1 3

友情鏈接更多精彩內(nèi)容