欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中的spring-retry重試機(jī)制解析

 更新時間:2024年01月26日 10:06:12   作者:ThinkPet  
這篇文章主要介紹了Spring中的spring-retry重試機(jī)制解析,spring-retry可以通過注解,在不入侵原有業(yè)務(wù)邏輯代碼的方式下,優(yōu)雅的實(shí)現(xiàn)重處理功能,在spring-retry中,所有配置都是基于簡單注釋的,需要的朋友可以參考下

spring-retey的依賴

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

spring-retry無注解方式使用

定義重試任務(wù)

package com.example.demo.retry;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.remoting.RemoteAccessException;
@Slf4j
public class RetryDemoTask {
    public static boolean retryTask(String param){
        log.info("收到請求參數(shù):{}",param);
        int i = RandomUtil.randomInt(0,11);
        log.info("param - i:{}",i);
        if (i==0){
            throw new IllegalArgumentException("參數(shù)異常");
        }else if (i==1){
            return true;
        }else if (i==2){
            return false;
        }else {
            throw new RemoteAccessException("遠(yuǎn)程訪問異常");
        }
    }
}

構(gòu)建重試邏輯并執(zhí)行調(diào)用

package com.example.demo;
import com.example.demo.retry.RetryDemoTask;
import com.example.demo.retry.SpringRetryDemo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.remoting.RemoteAccessException;
import org.springframework.retry.backoff.*;
import org.springframework.retry.policy.*;
import org.springframework.retry.support.RetryTemplate;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@SpringBootTest
public class SpringRetryTests {
 private long fixedPeriodTime = 1000L;
    private int maxRetryTimes = 3;
    private Map<Class<? extends Throwable>, Boolean> exceptionMap = new HashMap<>();
    /**
     * spring-retry支持的重試策略有
     *
     * NeverRetryPolicy 只允許retryCallback一次,不允許重試
     * AlwaysRetryPolicy 允許無限重試,直到成功,此方式邏輯不當(dāng)會導(dǎo)致死循環(huán)
     * SimpleRetryPolicy 固定次數(shù)重試,默認(rèn)重試最大次數(shù)為3次,RetryTemplate默認(rèn)使用的策略
     * TimeoutRetryPolicy 超時時間重試策略,默認(rèn)超時時間為1秒,在指定的超時時間內(nèi)允許重試
     * ExceptionClassifierRetryPolicy 設(shè)置不同異常的重試策略
     * CircuitBreakerRetryPolicy 有熔斷功能的重試策略,需要設(shè)置3個參數(shù)openTimeout\restTimeout和delegate
     * CompositeRetryPolicy: 組合重試策略,有2種組合方式,樂觀組合重試策略是指只要有一個策略允許即可以重試,
     * 悲觀組合重試策略是指只要有一個策略不允許即可以重試,但不管哪種組合方式,組合中的每一個策略都會執(zhí)行
     *
     * spring-retry支持的重試回退策略有
     *
     * NoBackOffPolicy:無退避算法策略,每次重試時立即重試
     * FixedBackOffPolicy: 固定時間的退避策略,需設(shè)置參數(shù)sleeper 等待策略和backOffPeriod休眠時間,默認(rèn)1s
     * UniformRandomBackOffPolicy: 隨機(jī)時間退避策略,需設(shè)置sleeper\minBackOffPeriod 和 maxBackOffPeriod
     * ExponentialBackOffPolicy 指數(shù)退避策略,需設(shè)置sleeper\initialInterval\maxInterval等參數(shù)
     * ExponentialRandomBackOffPolicy 隨機(jī)指數(shù)退避策略,引入隨機(jī)乘數(shù)可以實(shí)現(xiàn)隨機(jī)乘數(shù)回退
     *
     */
    @Test
    void t1() {
        exceptionMap.put(RemoteAccessException.class, true);
        //構(gòu)建重試模版
        RetryTemplate retryTemplate = new RetryTemplate();
        //設(shè)置重試回退策略
        // FixedBackOffPolicy主要設(shè)置重試間隔時間
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(fixedPeriodTime);
        //設(shè)置重試策略,主要設(shè)置重試次數(shù)
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(maxRetryTimes, exceptionMap);
        retryTemplate.setRetryPolicy(retryPolicy);
        retryTemplate.setBackOffPolicy(backOffPolicy);
        Boolean execute = retryTemplate.execute(
                //RetryCallback
                retryContext -> {
                    boolean abc = RetryDemoTask.retryTask("abc");
                    log.info("調(diào)用的結(jié)果:{}", abc);
                    return abc;
                },
                //RecoveryCallback
                retryContext -> {
                    log.info("已達(dá)到最大重試次數(shù)或拋出了不重試的異常...");
                    return false;
                }
        );
        log.info("執(zhí)行結(jié)果:{}", execute);
    }
}

spring-retry注解方式使用

啟用@EnableRetry 注解

@EnableRetry //spring-retry 基于注解的使用
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

定義重試任務(wù)

package com.example.demo.retry;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.remoting.RemoteAccessException;
@Slf4j
public class RetryDemoTask {
    public static boolean retryTask(String param){
        log.info("收到請求參數(shù):{}",param);
        int i = RandomUtil.randomInt(0,11);
        log.info("param - i:{}",i);
        if (i==0){
            throw new IllegalArgumentException("參數(shù)異常");
        }else if (i==1){
            return true;
        }else if (i==2){
            return false;
        }else {
            throw new RemoteAccessException("遠(yuǎn)程訪問異常");
        }
    }
}

定義重試服務(wù)層控制邏輯

package com.example.demo.retry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.remoting.RemoteAccessException;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class SpringRetryDemoService {
    //發(fā)生RemoteAccessException時重試
    //最大重試3次
    //第一次間隔2秒,以后都是次數(shù)的2倍,也就是第二次4秒,第三次6秒
    @Retryable(value = {RemoteAccessException.class},
            maxAttempts = 3,
            backoff = @Backoff(delay = 2000L,multiplier = 2))
    public boolean call(String param){
        return RetryDemoTask.retryTask(param);
    }
    @Recover
    public boolean recover(Exception e,String param){
        log.error("達(dá)到最大重試次數(shù),或拋出了一個沒有指定進(jìn)行重試的異常",e);
        log.info("recover param:{}",param);
        return false;
    }
}

執(zhí)行重試調(diào)用

@Slf4j
@SpringBootTest
public class SpringRetryTests2 {
    @Autowired
    private SpringRetryDemoService springRetryDemoService;
    @Test
    public void retry712(){
        boolean abc = springRetryDemoService.call("abc");
        log.info("---結(jié)果是:{}---",abc);
    }
}    

到此這篇關(guān)于Spring中的spring-retry重試機(jī)制解析的文章就介紹到這了,更多相關(guān)spring-retry重試機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn)

    springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn)

    本文主要介紹了springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue數(shù)據(jù)響應(yīng)式原理重寫函數(shù)實(shí)現(xiàn)數(shù)組響應(yīng)式監(jiān)聽

    vue數(shù)據(jù)響應(yīng)式原理重寫函數(shù)實(shí)現(xiàn)數(shù)組響應(yīng)式監(jiān)聽

    Vue的通過數(shù)據(jù)劫持的方式實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,即使用Object.defineProperty()來實(shí)現(xiàn)對屬性的劫持,但是Object.defineProperty()中的setter是無法直接實(shí)現(xiàn)數(shù)組中值的改變的劫持行為的,需要的朋友可以參考下
    2023-05-05
  • Springboot跨域問題三種解決方案

    Springboot跨域問題三種解決方案

    這篇文章主要介紹了Springboot跨域問題三種解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot中TypeExcludeFilter的作用及使用方式

    SpringBoot中TypeExcludeFilter的作用及使用方式

    在SpringBoot應(yīng)用程序中,TypeExcludeFilter通過過濾特定類型的組件,使它們不被自動掃描和注冊為bean,這在排除不必要的組件或特定實(shí)現(xiàn)類時非常有用,通過創(chuàng)建自定義過濾器并注冊到spring.factories文件中,我們可以在應(yīng)用啟動時生效
    2025-01-01
  • java基于Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除

    java基于Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除

    本篇文章主要介紹了Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除,實(shí)現(xiàn)了FTP文件上傳(斷點(diǎn)續(xù)傳)、FTP文件下載、FTP文件重命名、FTP文件刪除等功能,有需要的可以了解一下。
    2016-11-11
  • java正則表達(dá)式應(yīng)用的實(shí)例代碼

    java正則表達(dá)式應(yīng)用的實(shí)例代碼

    java正則的實(shí)例應(yīng)用分析,大家從下面的代碼中,就能知道java正則的應(yīng)用與寫法
    2008-10-10
  • java中PriorityBlockingQueue的入隊(duì)知識點(diǎn)總結(jié)

    java中PriorityBlockingQueue的入隊(duì)知識點(diǎn)總結(jié)

    在本篇文章里小編給大家整理一篇關(guān)于java中PriorityBlockingQueue的入隊(duì)知識點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Spring框架 XML配置事務(wù)控制的步驟操作

    Spring框架 XML配置事務(wù)控制的步驟操作

    這篇文章主要介紹了Spring框架 XML配置事務(wù)控制的步驟操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot集成Redis向量數(shù)據(jù)庫實(shí)現(xiàn)相似性搜索功能

    SpringBoot集成Redis向量數(shù)據(jù)庫實(shí)現(xiàn)相似性搜索功能

    Redis?是一個開源(BSD?許可)的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲,用作數(shù)據(jù)庫、緩存、消息代理和流式處理引擎,向量檢索的核心原理是通過將文本或數(shù)據(jù)表示為高維向量,并在查詢時根據(jù)向量的相似度進(jìn)行搜索,本文給大家介紹了SpringBoot集成Redis向量數(shù)據(jù)庫實(shí)現(xiàn)相似性搜索功能
    2024-09-09
  • Lambda表達(dá)式的使用及注意事項(xiàng)

    Lambda表達(dá)式的使用及注意事項(xiàng)

    這篇文章主要介紹了Lambda表達(dá)式的使用及注意事項(xiàng),主要圍繞?Lambda表達(dá)式的省略模式?Lambda表達(dá)式和匿名內(nèi)部類的區(qū)別的相關(guān)內(nèi)容展開詳情,感興趣的小伙伴可以參考一下
    2022-06-06

最新評論