<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1415字,需瀏覽 3分鐘

           ·

          2020-08-05 17:46


          當(dāng)我們調(diào)用一個接口可能由于網(wǎng)絡(luò)等原因造成第一次失敗,再去嘗試就成功了,這就是重試機(jī)制,spring支持重試機(jī)制,并且在Spring Cloud中可以與Hystaix結(jié)合使用,可以避免訪問到已經(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注解,表示啟用重試機(jī)制。


          @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í)行結(jié)束");
          ????????return?totalNum - num;
          ????}
          }


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


          測試:




          重試三次拋出異常。


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


          關(guān)于@Recover注解



          和minGoodsnum定義在一個類中


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


          重試測試一下,



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


          采坑提示:


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


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

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


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


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


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



          瀏覽 19
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  四虎精品成人无码A片 | 无码av免费在线观看 | 碰人人操在线 | 秋霞午夜 | 亚洲伊人成人网站 |