一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - 淺談spring的重試機制無效@Retryable@EnableRetry

淺談spring的重試機制無效@Retryable@EnableRetry

2020-09-18 14:10Singlerr JAVA教程

這篇文章主要介紹了淺談spring的重試機制無效@Retryable@EnableRetry,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

spring-retry模塊支持方法和類、接口、枚舉級別的重試

方式很簡單,引入pom包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>lastest</version>
</parent>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
  <version>1.1.2.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.6</version>
</dependency>

然后在@Configuration注解的類中添加@EnableRetry

最后在想要重試的方法上添加@Retryable(Exception.class)

由于retry用到了aspect增強,所有會有aspect的坑,就是方法內部調用,會使aspect增強失效,那么retry當然也會失效。

例如

?
1
2
3
4
5
6
7
8
9
10
public class demo {
  public void A() {
    B();
  }
 
  @Retryable(Exception.class)
  public void B() {
    throw new RuntimeException("retry...");
  }
}

 

這種情況B()不會重試。

補充知識:Springboot整合Spring Retry實現重試機制

在項目開發過程中,經常會有這樣的情況:第一次執行一個操作不成功,考慮到可能是網絡原因造成,就多執行幾次操作,直到得到想要的結果為止,這就是重試機制。

Springboot可以通過整合Spring Retry框架實現重試。

下面講一下在之前新建的ibatis項目基礎上整合Spring Retry框架的步驟:

1、首先要在pom.xml配置中加入spring-retry的依賴:

?
1
2
3
4
5
6
7
8
<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
</dependency>

2、在啟動類中加入重試注解@EnableRetry。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;
 
@EnableRetry //重試注解
@MapperScan("com.batis.mapper")
@SpringBootApplication
public class BatisApplication {
  public static void main(String[] args) {
    SpringApplication.run(BatisApplication.class, args);
  }
}

3、新建重試接口RetryService和實現類RetryServiceImpl

重試接口:

?
1
2
3
public interface RetryService {
  void retryTransferAccounts(int fromAccountId, int toAccountId, float money) throws Exception;
}

接口實現類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import com.batis.mapper.AccountMapper;
import com.batis.model.Account;
import com.batis.service.RetryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
@Service
public class RetryServiceImpl implements RetryService {
  @Autowired
  private AccountMapper accountMapper;
 
  @Transactional
  @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 3000, multiplier = 1, maxDelay = 10000))
  @Override
  public void retryTransferAccounts(int fromAccountId, int toAccountId, float money) throws Exception {
    Account fromAccount = accountMapper.findOne(fromAccountId);
    fromAccount.setBalance(fromAccount.getBalance() - money);
    accountMapper.update(fromAccount);
 
    int a = 2 / 0;
    Account toAccount = accountMapper.findOne(toAccountId);
    toAccount.setBalance(toAccount.getBalance() + money);
    accountMapper.update(toAccount);
    throw new Exception();
  }
 
  @Recover
  public void recover(Exception e) {
    System.out.println("回調方法執行!!!");
  }
}

@Retryable:標記當前方法會使用重試機制

value:重試的觸發機制,當遇到Exception異常的時候,會觸發重試

maxAttempts:重試次數(包括第一次調用)

delay:重試的間隔時間

multiplier:delay時間的間隔倍數

maxDelay:重試次數之間的最大時間間隔,默認為0,如果小于delay的設置,則默認為30000L

@Recover:標記方法為回調方法,傳參與@Retryable的value值需一致

4、新建重試控制器類RetryController

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import com.batis.service.RetryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/retry")
public class RetryController {
  @Autowired
  private RetryService retryService;
 
  @RequestMapping(value = "/transfer", method = RequestMethod.GET)
  public String transferAccounts() {
    try {
      retryService.retryTransferAccounts(1, 2, 200);
      return "ok";
    } catch (Exception e) {
      return "no";
    }
  }
}

5、啟動ibatis項目進行測試,在瀏覽器地址欄輸入:http://localhost:8080/retry/transfer

淺談spring的重試機制無效@Retryable@EnableRetry

可以看到,轉賬操作一共執行了3次,最后執行了回調方法。

至此Springboot整合Spring Retry的步驟已經完成,測試也非常成功!

有可以改進的地方希望諸位同學不要吝惜筆墨,加以指正,萬分感謝!

以上這篇淺談spring的重試機制無效@Retryable@EnableRetry就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/xsgnzb/article/details/78780795

延伸 · 閱讀

精彩推薦
  • JAVA教程30條Java代碼編寫經驗分享

    30條Java代碼編寫經驗分享

    你知道寫好Java代碼的30條經驗是什么嗎?這篇文章主要為大家分享了30條Java代碼編寫經驗技巧,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Java開發-擱淺4672020-08-11
  • JAVA教程詳解Java中的迭代器Iterator與枚舉器Enumeration

    詳解Java中的迭代器Iterator與枚舉器Enumeration

    Iterator與Enumeration分別是實現迭代器和枚舉器類的接口,下面就帶大家來詳解Java中的迭代迭代器Iterator與枚舉器Enumeration,以及它們之間的區別. ...

    kuiwu-wang3772020-05-04
  • JAVA教程詳解Java注解教程及自定義注解

    詳解Java注解教程及自定義注解

    這篇文章主要為大家詳細介紹了Java注解教程及自定義注解,幫助大家更好地學習Java注解,感興趣的小伙伴們可以參考一下 ...

    lijiao2582020-03-24
  • JAVA教程使用Java對數據庫進行基本的查詢和更新操作

    使用Java對數據庫進行基本的查詢和更新操作

    這篇文章主要介紹了使用Java對數據庫進行基本的查詢和更新操作,是Java入門學習中的基礎知識,需要的朋友可以參考下 ...

    goldensun3572020-01-09
  • JAVA教程java中for循環刪除集合陷阱

    java中for循環刪除集合陷阱

    java中在增強for循環為什么不能增刪集合呢?一個循環迭代,跟集合的增刪改沒什么關系。修改集合不是for去做的。for只管循環迭代,你在循環里邊修改集合...

    hebedich4712019-12-17
  • JAVA教程常用Eclipse快捷方式(推薦)

    常用Eclipse快捷方式(推薦)

    下面小編就為大家帶來一篇常用Eclipse快捷方式(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian2622020-05-08
  • JAVA教程java生成彩色附logo二維碼

    java生成彩色附logo二維碼

    這篇文章主要為大家介紹了java生成帶logo的多彩二維碼,比一般二維碼顏色鮮艷,美觀,如何生成二維碼,下面小編為大家分享實現代碼,感興趣的小伙伴...

    lijiao3992020-04-17
  • JAVA教程java獲取登錄者IP和登錄時間的兩種實現代碼詳解

    java獲取登錄者IP和登錄時間的兩種實現代碼詳解

    這篇文章主要介紹了java獲取登錄者IP和登錄時間的實現代碼,本文通過兩種結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒...

    心寒丶1802020-07-21
主站蜘蛛池模板: 韩国女主播在线大尺无遮挡 | 亚洲色图.com | 被老外操 | 美女的隐私无遮挡撒尿 | 亚洲国产天堂 | 果冻传媒在线播放观看228集 | 欧美美女被艹 | 欧美亚洲另类在线观看 | 国内小情侣一二三区在线视频 | 婷婷激情综合五月天 | 久久精品亚洲国产AV涩情 | 国产成人精品一区二三区 | 久久这里只有精品视频e | 2022日韩理论片在线观看 | 成人国产网站v片免费观看 成人国产精品视频 | 农村妇女野外牲交一级毛片 | 午夜大片在线观看 | www.一区二区三区.com | 99久久一香蕉国产线看观看 | 国色天香社区视频在线观看免费完整版 | 日本特黄一级午夜剧场毛片 | 亚洲欧美久久婷婷爱综合一区天堂 | 情欲满载2012美国dvd | 成年男女免费视频观看性 | kkkk4444在线看片免费 | 91精品久久 | 美女福利网站 | 好男人资源免费播放 | 99这里只有精品66视频 | 99ri在线精品视频 | 大胸孕妇孕交pregnantsex 大象视频污 | 青草碰人人澡人人澡 | 极品丝袜老师h系列全文阅读 | 地址二地址三2021变更 | 邪恶肉肉全彩色无遮盖 | 午夜亚洲WWW湿好大 午夜想想爱 | 精品综合久久久久久8888 | 亚洲国产精品无码中文字幕 | 久久久久激情免费观看 | 色网免费观看 | 草莓视频在线观看免费 |