[TOC]
简单介绍
项目 中在 网络波动的情况下需要使用 失败重试 springretry
导入pom.xml 添加jar
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
添加注解 在启动类
package com.yyb.ch;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
//,"com.yyb.ch.Task" ,"com.yyb.ch.jobhandler"
@ComponentScan(basePackages = {"com.yyb.ch.controller","com.yyb.ch.service.*","com.yyb.ch.common","com.yyb.ch.jobhandler"})
@MapperScan("com.yyb.ch.dao")
@SpringBootApplication
public class CwmsProducerApplication {
public static void main(String[] args) {
SpringApplication.run(CwmsProducerApplication.class, args);
}
}
添加 重试注解在 service中
package com.springcloud.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import java.time.LocalTime;
/**
* @version V1.0.1
* @projectName scums
* @packageName com.springcloud.service
* @description desc
* @email xiaolei@cscongheng.com
* @date 2020-02-17 16:39
**/
@Service
public class PayService {
private Logger logger = LoggerFactory.getLogger(getClass());
private final int totalNum = 100000;
/**
* @param num
* @return
* @throws Exception
* @DESC 创建 支付订单
*/
// @Backoff 重试等待策略
// delay:指定延迟后重试
// multiplier:指定延迟的倍数,比如delay=5000l,multiplier=2时,第一次重试为5秒后,第二次为10秒,第三次为20秒
@Retryable(value = Exception.class, maxAttempts = 5, backoff = @Backoff(delay = 2000L, multiplier = 2))
public int createOrder(int num) throws Exception {
logger.info("调用支付接口" + LocalTime.now());
logger.info("调用支付接口中");
if (num <= 0) {
throw new IllegalArgumentException("调用支付接口error");
}
logger.info("调用支付接口success"+ LocalTime.now());
return totalNum - num;
}
@Recover
public int recover(Exception e) {
logger.info(" --------------------------- ");
logger.info(e.getMessage());
logger.info("记录数据库中");
return 20;
}
}
测试结果
