更好的 java 重试框架 sisyphus 入门简介

2021年11月26日 阅读数:10
这篇文章主要向大家介绍更好的 java 重试框架 sisyphus 入门简介,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

What is Sisyphus

sisyphus 综合了 spring-retry 和 gauva-retrying 的优点,使用起来也很是灵活。java

为何选择这个名字

我以为重试作的事情和西西弗斯很类似。git

一遍遍的重复,可能徒劳无功,可是乐此不疲。github

人必定要想象西西弗斯的快乐。——加缪spring

其余缘由

之前看了 java retry 的相关框架,
虽然以为其中有不少不足之处。可是没有任何重复造轮子的冲动,以为是徒劳无功的。编程

固然这段时间也看了 Netty 的接口设计,和 Hibernate-Validator 的接口设计,以为很是的巧妙。框架

以为把这些东西结合,能够写出一个还不错的框架,就写了起来。maven

至少,sisyphus 是快乐的。ide

关于版本

此次的框架版本采用了比较保守的方式,使用 0.0.X工具

缘由有两个:测试

(1)我认为前期出于实验阶段。代码并不成熟,自测也不充分。因此不适合用于生产。

(2)这样能够快速迭代,而不至于为了追求更好致使版本特性迟迟没法迭代。

版本特性

我用了 5 个版本,实现了主要的特性:

(1)基于 fluent 接口声明式调用

(2)基于 annotation 的代理实现

(3)spring 的整合实现

(4)自定义注解的实现

未完成的工做

  • 更方便的工具类。

  • 使用文档

  • 测试代码

感觉

想法是很容易产生的,可是想把它变成一个稳定的框架须要很长的时间锤炼。

为何选择 sisyphus

做为开发者,咱们通常都会选择比较著名的框架。

好比 guava-retrying spring-retry。

或者干脆本身写一个。

为何不是 guava-retrying/spring-retry

java retry 这篇文章中我列举了常见的实现方式
以及上述的两种框架,也讲述了其中的不足。

guava-retrying 优缺点

优势

  • 使用灵活

  • fluent 优雅写法

  • 提供足够多的实现

缺点

  • 没有默认基于注解的实现

  • 重试策略设计并不友好

spring-retry

优势

  • 使用简单

缺点

  • 重试条件单一

  • 重试等待策略单一

  • 没法自定义注解

为何不本身写一个

我的感觉

我做为一名开发,平时说实在的,看到重试。

我确定会偷懒写一个 for 循环,重试几回就结束了。

由于时间不容许。

若是你更勤快一点,就能够选择 spring-retry/guava-retrying。若是你熟悉他们的优缺点的话。

若是你渴望创造

sisyphus 全部的实现都是基于接口的。

你彻底能够实现本身的实现,全部的东西基本彻底能够被替换。

固然一些常见的策略实现,项目的基本框架都有详尽的注释,当作参考也能够有一点帮助。

sisyphus 作的更多的事情

netty 的灵感

参考了 netty 的设计,保证接口实现的一致性。

并且 sisyphus 还作了更多,还保证了接口和注解之间的一致性。

使用引导类,保证使用时的便利性,后期拓展的灵活性。

hibernate-validator

hibernate-validator 的做者是我知道为数很少的对于 java 注解应用很棒的开发者。(虽然所知甚少)

自定义注解就是从这个框架中学来的。

与 spring 为伍

spring 基本与咱们的代码如影随行,因此你能够很简单的结合 spring.

就像你使用 spring-retry 同样。

快速开始

须要

jdk1.7+

maven 3.x+

maven 引入

sisyphus 使用 maven 管理 jar,

<plugin>
    <groupId>com.github.houbb</groupId>
    <artifactId>sisyphus-core</artifactId>
    <version>0.0.6</version>
</plugin>

编码

做为入门案例,咱们首先介绍些简单灵活的声明式编程

public void helloTest() {
    Retryer.<String>newInstance()
            .callable(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    System.out.println("called...");
                    throw new RuntimeException();
                }
            }).retryCall();
}

代码简介

Retryer.<String>newInstance() 建立引导类的实例,String 是 callable 也就是待重试方法的返回值类型。

callable() 指定待重试的方法实现。

retryCall() 触发重试调用。

日志信息

called...
called...
called...

以及一些异常信息。

等价配置

上面的配置其实有不少默认值,以下:

/**
 * 默认配置测试
 */
@Test(expected = RuntimeException.class)
public void defaultConfigTest() {
    Retryer.<String>newInstance()
            .maxAttempt(3)
            .listen(RetryListens.noListen())
            .recover(Recovers.noRecover())
            .condition(RetryConditions.hasExceptionCause())
            .retryWaitContext(RetryWaiter.<String>retryWait(NoRetryWait.class).context())
            .callable(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    System.out.println("called...");
                    throw new RuntimeException();
                }
            }).retryCall();
}

这些默认值都是能够配置的。

好比何时触发重试?重试几回?多久触发一次重试?这些都会在下面的章节进行详细讲解。

小结

本文简单介绍了重试框架的设计原因,及其使用入门。

java 重试框架 sisyphus 开源地址

但愿本文对你有所帮助,若是喜欢,欢迎点赞收藏转发一波。

我是老马,期待与你的下次重逢。

在这里插入图片描述