在项目开发过程中,经常会有这样的情况:第一次执行一个操作不成功,考虑到可能是网络原因造成,就多执行几次操作,直到得到想要的结果为止,这就是重试机制。
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")@SpringBootApplicationpublicclassBatisApplication{publicstaticvoidmain(String[] args){
SpringApplication.run(BatisApplication.class, args);}}
3、新建重试接口RetryService和实现类RetryServiceImpl
重试接口:
publicinterfaceRetryService{voidretryTransferAccounts(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;@ServicepublicclassRetryServiceImplimplementsRetryService{@Autowiredprivate AccountMapper accountMapper;@Transactional@Retryable(value= Exception.class, maxAttempts=3, backoff=@Backoff(delay=3000, multiplier=1, maxDelay=10000))@OverridepublicvoidretryTransferAccounts(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);thrownewException();}@Recoverpublicvoidrecover(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")publicclassRetryController{@Autowiredprivate RetryService retryService;@RequestMapping(value="/transfer", method= RequestMethod.GET)public StringtransferAccounts(){try{
retryService.retryTransferAccounts(1,2,200);return"ok";}catch(Exception e){return"no";}}}
5、启动ibatis项目进行测试,在浏览器地址栏输入:http://localhost:8080/retry/transfer
可以看到,转账操作一共执行了3次,最后执行了回调方法。
至此Springboot整合Spring Retry的步骤已经完成,测试也非常成功!
有可以改进的地方希望诸位同学不要吝惜笔墨,加以指正,万分感谢!
参考链接:
https://blog.csdn.net/qq_35387940/article/details/99676114