前言:
在上一篇文章 用rabbitmq实现消息重发功能 中,使用了外部的rabbitmq来实现了消息重发的功能,但是使用rabbitmq来实现并不适用于所有的场景,在这篇文章中,我再扩展两种仅用java本身就能实现的方法。
- Retryer
- @Retryable
实现过程:
Retryer
Retryer是谷歌 Guava 库下的工具,用 Retryer可以封装成util类,只需要几行代码,就能完成一个很简单的重试功能了。
首先是导包
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>2.0.0</version>
</dependency>
Mavn库中,目前最新的就是2.0.0这个版本了 。
接下来就是工具类的实现了
import com.github.rholder.retry.*;
import com.google.common.base.Predicate;
import java.util.concurrent.TimeUnit;
/**
* guava重试工具
*/
public class RetryUtil {
/**
* 对使用的方法进行重试,与预期不一样的结果也可以进行重试
*
* @param attemptNumber 执行次数 1是只执行1次,相当于不重试
* @param retryInterval 每次重试的时间间隔,单位:秒
* @param predicateResult 结果谓词,如果谓词不为null,并且谓词条件满足,也会进行重试的。条件不满足的情况下则不进行重试。(可选
* @param predicateException 异常谓词,不为null则会匹配传入的异常,满足条件,则会重试。如果为null,则全部异常都会进行重试
* @param <R> 返回类型
* @return
* @throws RetryException 执行完全不的重试次数后,还是未成功,那么会抛出异常,建议外层调用是catch住
*/
public static <R> Retryer<R> buildRetryer(int attemptNumber, long retryInterval,
Predicate<R> predicateResult, Predicate