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

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

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
主站蜘蛛池模板: 欧美精品一区视频 | www在线视频在线播放 | 皇上好大好硬好涨好深好爽 | 免费一级欧美大片在线观看 | 国产亚洲人成网站天堂岛 | 欧美一级欧美三级 | 精品综合久久久久久8888 | 成人中文字幕在线观看 | 男人把j放进女人的p里视频 | 91社区在线观看精品 | 99久久国产综合精麻豆 | 国产99久久久国产精品成人 | 黑人粗又长 | 日日艹 | 亚洲 欧美 清纯 校园 另类 | 亚洲精品国产精品麻豆99 | 午夜A级理论片左线播放 | 久久精品18| 亚洲欧美国产自拍 | 免费观看欧美成人h | 国产三区二区 | 91麻豆精品激情在线观看最新 | bdsm酷刑折磨死美女 | 青青青久热国产精品视频 | 男男gaygays黑人| 久久成人亚洲 | 韩国免费特一级毛片 | a看片| 久9视频这里只有精品123 | 欧美最猛性xxxxx动态图 | 视频一区二区国产 | 交换余生在线播放免费 | 亚洲同性男男gay1069 | 国产成人8x视频一区二区 | 成人资源影音先锋久久资源网 | 秋葵丝瓜茄子草莓榴莲樱桃 | 久久爽狠狠添AV激情五月 | 香蕉精品国产高清自在自线 | 动漫白丝袜美女羞羞 | 国色天香社区视频在线观看免费完整版 | 忘忧草高清|