编程语言
首页 > 编程语言> > Java重试机制简单使用(基于guava-retrying实现)

Java重试机制简单使用(基于guava-retrying实现)

作者:互联网

一、简单介绍

二、相关依赖

<dependency>
     <groupId>com.github.rholder</groupId>
     <artifactId>guava-retrying</artifactId>
     <version>2.0.0</version>
</dependency>

三、演示demo

高阶的使用方式可以重点参考官方文档,基本的使用废话不多说,直接上代码:

package com.ideax.retry.guava;

import com.github.rholder.retry.*;
import com.google.common.base.Preconditions;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * 基于Guava的重试机制
 *
 * @author zhangxs
 **/
public class GuavaRetryDemo {
    public static void retrySendMessage(String phone, String message) {
        // 定义重试规则(如果需要其他更详细的规则,建议看源码)
        Retryer<Boolean> retry = RetryerBuilder.<Boolean>newBuilder()
                .retryIfException()
                // 运行时异常时
                .retryIfRuntimeException()
                // call方法返回true时重试
                .retryIfResult(ab -> Objects.equals(ab, true))
                // 10秒后重试
                .withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS))
                // 重试n次,超过次数就...
                .withStopStrategy(StopStrategies.stopAfterAttempt(5))
                // 可以自定义监听器
                // .withRetryListener()
                .build();

        // 调用重试任务
        try {
            retry.call(() -> {
                try {
                    send(phone,message);
                    return false;
                } catch (Exception e) {
                    System.out.println("[" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                            .format(LocalDateTime.now()) + "]尝试重新发送:" + e.getMessage());
                    return true;
                }
            });
        } catch (ExecutionException | RetryException e) {
            e.printStackTrace();
        }
    }

    public static void send(String phone, String message) {
        // 参数校验
        Preconditions.checkNotNull(phone,"phone不能为空!");
        Preconditions.checkNotNull(message,"message不能为空!");

        // 您老的业务代码,千言万语都在这里了,比如通过第三方平台发送短信,随便随机抛个异常
        if (LocalDateTime.now().getSecond() % 3 == 0) {
            throw new RuntimeException("不好意思,短信平台已挂");
        }
        System.out.println("[" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                .format(LocalDateTime.now()) + "]短信发送成功:" + phone + "->" + message);
    }

    public static void main(String[] args) {
        retrySendMessage("18605998878","guava");
    }
}

四、参考

标签:Java,String,重试,phone,retrying,import,message,guava
来源: https://blog.csdn.net/weixin_38264394/article/details/116985148