最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談spring的重試機(jī)制無(wú)效@Retryable@EnableRetry

 更新時(shí)間:2020年09月18日 10:28:43   作者:Singlerr  
這篇文章主要介紹了淺談spring的重試機(jī)制無(wú)效@Retryable@EnableRetry,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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

方式很簡(jiǎn)單,引入pom包

<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增強(qiáng),所有會(huì)有aspect的坑,就是方法內(nèi)部調(diào)用,會(huì)使aspect增強(qiáng)失效,那么retry當(dāng)然也會(huì)失效。

例如

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

  @Retryable(Exception.class)
  public void B() {
    throw new RuntimeException("retry...");
  }
}

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

補(bǔ)充知識(shí):Springboot整合Spring Retry實(shí)現(xiàn)重試機(jī)制

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

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

下面講一下在之前新建的ibatis項(xiàng)目基礎(chǔ)上整合Spring Retry框架的步驟:

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

<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
</dependency>

2、在啟動(dòng)類中加入重試注解@EnableRetry。

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和實(shí)現(xiàn)類RetryServiceImpl

重試接口:

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

接口實(shí)現(xiàn)類:

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)前方法會(huì)使用重試機(jī)制

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

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

delay:重試的間隔時(shí)間

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

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

@Recover:標(biāo)記方法為回調(diào)方法,傳參與@Retryable的value值需一致

4、新建重試控制器類RetryController

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、啟動(dòng)ibatis項(xiàng)目進(jìn)行測(cè)試,在瀏覽器地址欄輸入:http://localhost:8080/retry/transfer

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

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

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

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

相關(guān)文章

  • JavaSE API實(shí)現(xiàn)生成隨機(jī)數(shù)的2種方法(Random類和Math類的Random方法)

    JavaSE API實(shí)現(xiàn)生成隨機(jī)數(shù)的2種方法(Random類和Math類的Random方法)

    本文主要介紹了JavaSE API實(shí)現(xiàn)生成隨機(jī)數(shù)的2種方法,主要包括Random類和Math類的random方法都可以用來(lái)生成隨機(jī)數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 詳解java如何正確使用volatile

    詳解java如何正確使用volatile

    這篇文章給大家分享了java如何正確使用volatile的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-07-07
  • Java基礎(chǔ)詳解之包裝類的裝箱拆箱

    Java基礎(chǔ)詳解之包裝類的裝箱拆箱

    這篇文章主要介紹了Java基礎(chǔ)詳解之包裝類的裝箱拆箱,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析

    詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析

    這篇文章主要介紹了詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java instanceof關(guān)鍵字的的進(jìn)一步理解

    Java instanceof關(guān)鍵字的的進(jìn)一步理解

    這篇文章主要介紹了Java instanceof關(guān)鍵字的的進(jìn)一步理解,本文用一些實(shí)例講解了instanceof操作符的一些知識(shí),需要的朋友可以參考下
    2015-03-03
  • Java的RxJava庫(kù)操作符的用法及實(shí)例講解

    Java的RxJava庫(kù)操作符的用法及實(shí)例講解

    RxJava由于提供異步和基于事件的支持在Android開(kāi)發(fā)者中獲得了不少人氣,這里我們就來(lái)看一下Java的RxJava庫(kù)操作符的用法及實(shí)例講解,需要的朋友可以參考下
    2016-06-06
  • java隨機(jī)生成10位數(shù)的字符串ID

    java隨機(jī)生成10位數(shù)的字符串ID

    這篇文章主要為大家詳細(xì)介紹了java隨機(jī)生成10位數(shù)字符串ID的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳解Java泛型及其應(yīng)用

    詳解Java泛型及其應(yīng)用

    這篇文章主要介紹了Java泛型及其應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解Java中雪花算法的實(shí)現(xiàn)

    詳解Java中雪花算法的實(shí)現(xiàn)

    雪花算法是一種分布式的id生成算法。原理是將long分成若干個(gè)區(qū)段分別管理。本文將利用Java簡(jiǎn)單的實(shí)現(xiàn)雪花算法,感興趣的可以了解一下
    2022-12-12
  • 如何實(shí)現(xiàn)java8 list按照元素的某個(gè)字段去重

    如何實(shí)現(xiàn)java8 list按照元素的某個(gè)字段去重

    這篇文章主要介紹了如何實(shí)現(xiàn)java8 list按照元素的某個(gè)字段去重,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

蓝山县| 左权县| 咸丰县| 英超| 西盟| 郸城县| 榆社县| 房山区| 兰考县| 邮箱| 鄯善县| 鄯善县| 福州市| 黔江区| 天津市| 增城市| 迭部县| 阳信县| 泽普县| 玉田县| 平顶山市| 阿拉善右旗| 新竹市| 娄底市| 噶尔县| 珠海市| 平凉市| 贵南县| 偃师市| 长宁区| 汉川市| 陈巴尔虎旗| 和硕县| 曲阜市| 安龙县| 巨野县| 永宁县| 开江县| 贡觉县| 射阳县| 东莞市|