zoukankan      html  css  js  c++  java
  • SpringBoot整合Spring Retry实现重试机制

    在项目开发过程中,经常会有这样的情况:第一次执行一个操作不成功,考虑到可能是网络原因造成,就多执行几次操作,直到得到想要的结果为止,这就是重试机制。
    Springboot可以通过整合Spring Retry框架实现重试。
    下面讲一下在之前新建的ibatis项目基础上整合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、在启动类中加入重试注解@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和实现类RetryServiceImpl
    重试接口:

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

    接口实现类:

    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

    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


    可以看到,转账操作一共执行了3次,最后执行了回调方法。
    至此Springboot整合Spring Retry的步骤已经完成,测试也非常成功!

  • 相关阅读:
    当你进退两难的时候,你想做出决定,抛硬币,当你第一次抛了之后,还想再一次抛的时候,你就知道这个问题的答案了。
    习惯几乎可以绑住一切,只是不能绑住偶然。比如那只偶然尝了鲜血的老虎。
    10个理由让你爱上程序员
    自己不做出点样子,人家想拉你一把都不知你的手在哪里。
    WSL(Windows Subsystem for Linux)笔记一安装与使用
    Nginx(三)-正向代理与反向代理
    Nginx(二)-服务模式运行nginx之WINSW
    Nginx(一)-windows下的安装配置
    WebSocket(一)-RFC6455
    NodeJS笔记(六)-Express HTTP服务器启动后如何关闭
  • 原文地址:https://www.cnblogs.com/47Gamer/p/13846292.html
Copyright © 2011-2022 走看看