1. 來了解一下 springboot 整合 retry 實現(xiàn)的重試機制

        共 1415字,需瀏覽 3分鐘

         ·

        2020-08-05 17:46


        當我們調(diào)用一個接口可能由于網(wǎng)絡等原因造成第一次失敗,再去嘗試就成功了,這就是重試機制,spring支持重試機制,并且在Spring Cloud中可以與Hystaix結合使用,可以避免訪問到已經(jīng)不正常的實例。


        寫一個簡單的demo,加入依賴:


        <dependencies>
        ????<dependency>
        ?????????<groupId>org.springframework.bootgroupId>
        ?????????<artifactId>spring-boot-starter-webartifactId>
        ????dependency>
        ????<dependency>
        ?????????<groupId>org.springframework.retrygroupId>
        ?????????<artifactId>spring-retryartifactId>
        ?????dependency>
        ?????<dependency>
        ??????????<groupId>org.aspectjgroupId>
        ??????????<artifactId>aspectjweaverartifactId>
        ?????dependency>
        dependencies>


        在主類上加上@EnableRetry注解,表示啟用重試機制。


        @SpringBootApplication
        @EnableRetry
        public class Application {
        ????public?static?void?main(String[] args) {
        ????????SpringApplication.run(Application.class,args);
        ????}
        }


        定義一個簡單的controller層:


        @RestController
        public?class?HelloController?{

        ????Logger logger = LoggerFactory.getLogger(getClass());

        ????@Autowired
        ????private?PayService payService;

        ????@GetMapping("/createOrder")
        ????public?String createOrder(@RequestParam int?num)?throws?Exception{
        ????????int?remainingnum = payService.minGoodsnum(num == 0?? 1: num);
        ????????logger.info("剩余的數(shù)量==="+remainingnum);
        ????????return?"庫庫存成功";
        ????}

        }


        在controller中調(diào)用減庫存的service接口,


        @Service
        public?class?PayService?{

        ????private?Logger logger = LoggerFactory.getLogger(getClass());

        ????private?final?int?totalNum = 100000;


        ????@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
        ????public?int?minGoodsnum(int?num)?throws?Exception{
        ????????logger.info("minGoodsnum開始"+ LocalTime.now());
        ????????if(num <= 0){
        ????????????throw?new?Exception("數(shù)量不對");
        ????????}
        ????????logger.info("minGoodsnum執(zhí)行結束");
        ????????return?totalNum - num;
        ????}
        }


        在minGoodsnum方法上加上@Retryable注解,value值表示當哪些異常的時候觸發(fā)重試,maxAttempts表示最大重試次數(shù)默認為3,delay表示重試的延遲時間,multiplier表示上一次延時時間是這一次的倍數(shù)。


        測試:




        重試三次拋出異常。


        使用@Recover注解,當重試次數(shù)達到設置的次數(shù)的時候,還是失敗拋出異常,執(zhí)行的回調(diào)函數(shù)。


        關于@Recover注解



        和minGoodsnum定義在一個類中


        @Recover
        public?int?recover(Exception e){
        ????????logger.warn("減庫存失?。。。?);
        ????????//記日志到數(shù)據(jù)庫
        ????????return?totalNum;
        }


        重試測試一下,



        感覺意義不大,重試失敗的時候應該還是要拋出異常的,在上層進行catch記錄日志,當然也有特殊的場景適用。


        采坑提示:


        1、由于retry用到了aspect增強,所有會有aspect的坑,就是方法內(nèi)部調(diào)用,會使aspect增強失效,那么retry當然也會失效。


        public?class?demo?{
        public?void?A()?{
        B();
        }

        //這里B不會執(zhí)行
        @Retryable(Exception.class)
        public?void?B()?{
        throw?new?RuntimeException("retry...");
        }
        }


        2、重試機制,不能在接口實現(xiàn)類里面寫。所以要做重試,必須單獨寫個service。


        3、maxAttemps參數(shù)解釋的是說重試次數(shù),測試的時候發(fā)現(xiàn)這個=1時,方法一共只執(zhí)行了一次,=3時,一共只執(zhí)行3次。


        出處:cnblogs.com/panchanggui/p/12849325.html



        瀏覽 19
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 操逼国产无码 | 纲手裸乳被爆白浆 | 乱子伦国产精品www | 七次郎在线视频 | 翔田千里AV在线 |