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

Spring中的spring-retry重試機制解析

 更新時間:2024年01月26日 10:06:12   作者:ThinkPet  
這篇文章主要介紹了Spring中的spring-retry重試機制解析,spring-retry可以通過注解,在不入侵原有業(yè)務(wù)邏輯代碼的方式下,優(yōu)雅的實現(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("遠程訪問異常");
        }
    }
}

構(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 允許無限重試,直到成功,此方式邏輯不當會導致死循環(huán)
     * SimpleRetryPolicy 固定次數(shù)重試,默認重試最大次數(shù)為3次,RetryTemplate默認使用的策略
     * TimeoutRetryPolicy 超時時間重試策略,默認超時時間為1秒,在指定的超時時間內(nèi)允許重試
     * ExceptionClassifierRetryPolicy 設(shè)置不同異常的重試策略
     * CircuitBreakerRetryPolicy 有熔斷功能的重試策略,需要設(shè)置3個參數(shù)openTimeout\restTimeout和delegate
     * CompositeRetryPolicy: 組合重試策略,有2種組合方式,樂觀組合重試策略是指只要有一個策略允許即可以重試,
     * 悲觀組合重試策略是指只要有一個策略不允許即可以重試,但不管哪種組合方式,組合中的每一個策略都會執(zhí)行
     *
     * spring-retry支持的重試回退策略有
     *
     * NoBackOffPolicy:無退避算法策略,每次重試時立即重試
     * FixedBackOffPolicy: 固定時間的退避策略,需設(shè)置參數(shù)sleeper 等待策略和backOffPeriod休眠時間,默認1s
     * UniformRandomBackOffPolicy: 隨機時間退避策略,需設(shè)置sleeper\minBackOffPeriod 和 maxBackOffPeriod
     * ExponentialBackOffPolicy 指數(shù)退避策略,需設(shè)置sleeper\initialInterval\maxInterval等參數(shù)
     * ExponentialRandomBackOffPolicy 隨機指數(shù)退避策略,引入隨機乘數(shù)可以實現(xiàn)隨機乘數(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("已達到最大重試次數(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("遠程訪問異常");
        }
    }
}

定義重試服務(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("達到最大重試次數(shù),或拋出了一個沒有指定進行重試的異常",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重試機制解析的文章就介紹到這了,更多相關(guān)spring-retry重試機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue+springboot上傳文件、圖片、視頻及回顯到前端詳解

    vue+springboot上傳文件、圖片、視頻及回顯到前端詳解

    一般來說vue可以使用axios或者fetch等ajax庫發(fā)送文件請求,而springboot則可以使用Spring MVC的方式來處理上傳文件請求,下面這篇文章主要給大家介紹了關(guān)于vue+springboot上傳文件、圖片、視頻及回顯到前端的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot訪問接口自動跳轉(zhuǎn)login頁面的問題及解決

    SpringBoot訪問接口自動跳轉(zhuǎn)login頁面的問題及解決

    這篇文章主要介紹了SpringBoot訪問接口自動跳轉(zhuǎn)login頁面的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring MVC前后端的數(shù)據(jù)傳輸?shù)膶崿F(xiàn)方法

    Spring MVC前后端的數(shù)據(jù)傳輸?shù)膶崿F(xiàn)方法

    這篇文章主要介紹了Spring MVC前后端的數(shù)據(jù)傳輸?shù)膶崿F(xiàn)方法,需要的朋友可以參考下
    2017-10-10
  • JAVA區(qū)間值判斷[10,20)的實現(xiàn)

    JAVA區(qū)間值判斷[10,20)的實現(xiàn)

    本文主要介紹了JAVA區(qū)間值判斷[10,20)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • SpringBoot中的server.context-path的實現(xiàn)

    SpringBoot中的server.context-path的實現(xiàn)

    本文主要介紹了SpringBoot中的server.context-path的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • 解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題

    解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題

    這篇文章主要介紹了解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java兩個乒乓球隊比賽名單問題(判斷素數(shù))

    Java兩個乒乓球隊比賽名單問題(判斷素數(shù))

    兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單
    2017-02-02
  • springboot整合dubbo設(shè)置全局唯一ID進行日志追蹤的示例代碼

    springboot整合dubbo設(shè)置全局唯一ID進行日志追蹤的示例代碼

    這篇文章主要介紹了springboot整合dubbo設(shè)置全局唯一ID進行日志追蹤,本文通過圖文示例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 解決Maven無法下載2.1.7.js7版本的itext依賴問題

    解決Maven無法下載2.1.7.js7版本的itext依賴問題

    本文主要解決使用Maven編譯項目時出現(xiàn)的itext依賴版本問題,通過分析,發(fā)現(xiàn)該問題是由jasperreports依賴的特定版本itext導致的,解決方法是排除jasperreports中的itext依賴,并自行指定更高版本的itext依賴
    2024-12-12
  • java項目中的多線程實踐記錄

    java項目中的多線程實踐記錄

    項目開發(fā)中對于一些數(shù)據(jù)的處理需要用到多線程,比如文件的批量上傳,數(shù)據(jù)庫的分批寫入,大文件的分段下載等,主要涉及到多線程的一些知識,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下
    2021-11-11

最新評論