在项目中调用第三方服务时候,使用异步加重试的一种姿势。
step1:maven添加pom依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
step2:开启springRetry重试和async异步:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableAsync
@EnableRetry
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
step3:定义一个service***(最好这个service干净,只是放需要调用异步接口代码,原因待会说)***
@Service
public class ServiceImpl implements Service{
/**
*异步操作【最佳状态不需要返回值,不然你调用该方法处不好处理】;遇到Exception异常最大重试3次
**/
@Override
@Async
@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 60000L, maxDelay = 600000L, multiplier = 2.5))
public void youMethod(Object args...)throws Exception {
//TODO some you code here...
}
}
还记得说过最好这个service干净,只是放需要调用异步接口代码?
这里总结一下@Async注解***无效的可能点***
一、异步方法使用static修饰
二、异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
三、测试异步方法不能与异步方法在同一个类中
四、测试类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
五、如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解