ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-05-18 13:30:34  阅读:342  来源: 互联网

标签:Java String 重试 phone retrying import message guava


一、简单介绍

  • Guava 是Java的工具集,提供了一些常用的便利的操作工具类,减少因为 空指针、异步操作等引起的问题BUG,提高开发效率。Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。
  • 在日常开发中,接口调用过程中出现异常是经常会遇到的,任何接口都会有不同概率的异常情况,对于可重入的接口,为了避免偶发性异常造成的服务不可用,重试机制就非常有必要了.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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有