关于开源:更好的-java-重试框架-sisyphus-入门简介

55次阅读

共计 2447 个字符,预计需要花费 7 分钟才能阅读完成。

What is Sisyphus

sisyphus 综合了 spring-retry 和 gauva-retrying 的劣势,应用起来也非常灵活。

为什么抉择这个名字

我感觉重试做的事件和西西弗斯很类似。

一遍遍的反复,可能徒劳无功,然而乐此不疲。

人肯定要设想西西弗斯的高兴。——加缪

其余起因

以前看了 java retry 的相干框架,
尽管感觉其中有很多不足之处。然而没有任何反复造轮子的激动,感觉是徒劳无功的。

当然这段时间也看了 Netty 的接口设计,和 Hibernate-Validator 的接口设计,感觉十分的奇妙。

感觉把这些货色联合,能够写出一个还不错的框架,就写了起来。

至多,sisyphus 是高兴的。

对于版本

这次的框架版本采纳了比拟激进的形式,应用 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 开源地址

心愿本文对你有所帮忙,如果喜爱,欢送点赞珍藏转发一波。

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

正文完
 0