当前位置: 首页 > 科技观察

说说一个实现接口重试的注解

时间:2023-03-20 11:23:46 科技观察

实际工作中,重处理是很常见的场景,比如:发送消息失败。调用远程服务失败。争用锁失败。这些错误可能是网络波动造成的,等待重新处理会成功。一般来说,再处理都是使用try/catch、while循环等语法,但是这种方式缺乏统一性,也不是很方便,需要写很多代码。而spring-retry可以在不侵入原有业务逻辑代码的情况下,通过注解优雅的实现再处理功能。1.什么是@Retryable?spring系列的spring-retry是另一个实用程序模块,可帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有的配置都是基于简单的注解。2.使用步骤(1)POM依赖org.springframework.retryspring-retry(2)启用@Retryable@EnableRetry@SpringBootApplicationpublicclassHelloApplication{publicstaticvoidmain(String[]args){SpringApplication.run(HelloApplication.class,args);}}(3)在方法上添加@Retryableimportcom.mail.elegant.service.TestRetryService;importorg.springframework.retry.annotation.Backoff;importorg.springframework.retry.annotation.Retryable;importorg.springframework.stereotype。服务;导入java.time.LocalTime;@ServicepublicclassTestRetryServiceImplimplementsTestRetryService{@Override@Retryable(value=Exception.class,maxAttempts=3,backoff=@Backoff(delay=2000,multiplier=1.5))publicinttest(intcode)throwsException{System.out.println("测试被调用,时间:"+LocalTime.now());if(code==0){thrownewException("情况不对头!");}System.out.println("测试被调用,情况正确!");返回200;}}简单解释一下注解中几个参数的含义:value:只有抛出指定的异常才会重试include:和value一样,默认为空。当exclude也为空时,默认所有异常。exclude:指定不处理的异常。maxAttempts:最大重试次数,默认3次。backoff:重试等待策略,默认使用@Backoff,@Backoff的值默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后重试,如果将multiplier设置为1.5,则第一次重试2秒,第二次3秒,第三次4.5秒。当重试次数用尽并且失败时会发生什么?当重试次数耗尽时,RetryOperations可以将控制权传递给另一个回调,即RecoveryCallback。Spring-Retry还为@Retryable提供了@Recover注解,用于重试失败的后处理方法。如果不需要回调方法,可以直接不写回调方法,那么效果就是重试次数结束后,如果仍然不满足业务判断,则抛出异常。(4)@Recover@Recoverpublicintrecover(Exceptione,intcode){System.out.println("回调方法执行!!!!");//记录日志到数据库或调用其他方法return400;}是的看到传入的参数中写了Exceptione,这是回调的connector代码(重试次数用完,还是失败,我们抛出此异常电子通知以触发此回调方法)。对于@Recover注解的方法,需要特别注意:方法的返回值必须和@Retryable方法保持一致。该方法的第一个参数必须是Throwable类型。建议与@Retryable配置的异常保持一致。其他参数,需要哪个参数,写进去即可(有的在@Recover方法中)。回调方法和重试方法写在同一个实现类中。重复java面试获取最新面试题。(5)注意事项由于是基于AOP实现,不支持类中的自调用方法。如果重试失败,需要后面跟@Recover注解的方法,那么重试方法不能有返回值,只能为void。方法中不能用trycatch,只能在外面抛异常。@Recover注解用于开启重试失败后调用的方法(注意必须和重新处理方法在同一个类)。该注解注解的方法参数必须是@Retryable抛出的异常,否则无法识别。日志处理方法。3.小结本文主要简单介绍了Springboot中Retryable的使用,主要适用场景及注意事项,在需要重试的时候还是很有用的。