激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語言 - 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的坑,就是方法內(nèi)部調(diào)用,會使aspect增強失效,那么retry當(dāng)然也會失效。

例如

?
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實現(xiàn)重試機制

在項目開發(fā)過程中,經(jīng)常會有這樣的情況:第一次執(zhí)行一個操作不成功,考慮到可能是網(wǎng)絡(luò)原因造成,就多執(zhí)行幾次操作,直到得到想要的結(jié)果為止,這就是重試機制。

Springboot可以通過整合Spring Retry框架實現(xiàn)重試。

下面講一下在之前新建的ibatis項目基礎(chǔ)上整合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和實現(xiàn)類RetryServiceImpl

重試接口:

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

接口實現(xiàn)類:

?
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("回調(diào)方法執(zhí)行!!!");
  }
}

@Retryable:標(biāo)記當(dāng)前方法會使用重試機制

value:重試的觸發(fā)機制,當(dāng)遇到Exception異常的時候,會觸發(fā)重試

maxAttempts:重試次數(shù)(包括第一次調(diào)用)

delay:重試的間隔時間

multiplier:delay時間的間隔倍數(shù)

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

@Recover:標(biāo)記方法為回調(diào)方法,傳參與@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項目進(jìn)行測試,在瀏覽器地址欄輸入:http://localhost:8080/retry/transfer

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

可以看到,轉(zhuǎn)賬操作一共執(zhí)行了3次,最后執(zhí)行了回調(diào)方法。

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

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

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

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

延伸 · 閱讀

精彩推薦
  • JAVA教程30條Java代碼編寫經(jīng)驗分享

    30條Java代碼編寫經(jīng)驗分享

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

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

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

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

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

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

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

    lijiao2582020-03-24
  • JAVA教程使用Java對數(shù)據(jù)庫進(jìn)行基本的查詢和更新操作

    使用Java對數(shù)據(jù)庫進(jìn)行基本的查詢和更新操作

    這篇文章主要介紹了使用Java對數(shù)據(jù)庫進(jìn)行基本的查詢和更新操作,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下 ...

    goldensun3572020-01-09
  • JAVA教程java中for循環(huán)刪除集合陷阱

    java中for循環(huán)刪除集合陷阱

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

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

    常用Eclipse快捷方式(推薦)

    下面小編就為大家?guī)硪黄S肊clipse快捷方式(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

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

    java生成彩色附logo二維碼

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

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

    java獲取登錄者IP和登錄時間的兩種實現(xiàn)代碼詳解

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

    心寒丶1802020-07-21
主站蜘蛛池模板: 手机av在线电影 | av电影在线观看网址 | 久久精品久久精品久久精品 | 一本色道久久综合狠狠躁篇适合什么人看 | 国产成人高清在线观看 | 在线播放视频一区二区 | 成人在线观看免费观看 | 精品国产一区二区亚洲人成毛片 | 色播av在线| 特级毛片免费视频 | 粉嫩粉嫩一区二区三区在线播放 | 999久久久精品 | 97se亚洲综合在线韩国专区福利 | 国产a级久久 | 久久伊人精品热在75 | 日本68xxxx | 欧美日韩在线免费观看 | 精品无吗乱吗av国产爱色 | 欧美成人精品欧美一级 | av手机在线电影 | 国产欧美亚洲精品a | 羞羞答答tv| 成人免费网站在线观看 | 欧美日韩色片 | 极品大长腿啪啪高潮露脸 | 日本高清无遮挡 | 成人在线视频免费播放 | 日韩在线播放中文字幕 | 欧美在线国产 | 久久午夜国产 | v片在线看| 成人羞羞在线观看网站 | 免费毛片在线视频 | 日韩av电影在线免费观看 | 性少妇chinesevideo| 一本一道久久久a久久久精品91 | 成人午夜免费福利 | 色综合精品 | 懂色av懂色aⅴ精彩av | 成人午夜精品久久久久久久蜜臀 | 国产小视频在线观看 |