更好的 java 重试框架 sisyphus 入门简介
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 入门简介的更多相关文章
- 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍
回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 背后的故事 这一节让我们一起学习下 sisyphus 基于函数式的配置和注解 ...
- 更好的 java 重试框架 sisyphus 的 3 种使用方式
回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍 更好的 java 重试框架 sisyphus 背后的 ...
- 更好的 java 重试框架 sisyphus 背后的故事
sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 今天,让我们一起看一下西西弗斯背后的故事. 情景导入 简单的需求 产品经理:实现一个 ...
- Java任务调度框架Quartz入门
Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框 ...
- 更好用 更简单的Java缓存框架 jscache
比Spring Cache 更好用 更简单的缓存工具 jscache 取名意义为 java simple cache,基于AOP实现,支持注解到接口 自定义单个缓存过期时间配置 ttl,轻松扩展缓存实 ...
- Java爬虫框架WebMagic——入门(爬取列表类网站文章)
初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ...
- (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例
http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...
- (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...
- Java爬虫框架WebMagic入门——爬取列表类网站文章
初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ...
随机推荐
- 安装和配置CloudWatchAgent
文章原文 使用 CloudWatch 代理收集指标和日志 下载 CloudWatch 代理软件包 sudo yum install amazon-cloudwatch-agent 点击查看其他平台软件 ...
- MyBatis-Plus 代码生成器模板
MyBatis-Plus 代码生成器模板 maven 依赖 <!--Mysql--> <dependency> <groupId>mysql</groupId ...
- vue的常见理论问题
1.什么是 mvvm? mvvm 和 mvc 区别? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,View 代表 UI 组件. ...
- gohbase使用文档
目录 1. 建立连接 2. 创建表 3. 插入记录 4. 删除记录 5. 查询记录 5.1 根据RowKey查询 5.2 scan范围查询 5.3 复杂查询(过滤器的使用) 5.3.1 比较过滤器 5 ...
- 【OI】计算分子量 Molar mass UVa 1586 题解
题目:(由于UVa注册不了,还是用vjudge) https://vjudge.net/problem/UVA-1586 详细说明放在了注释里面.原创. 破题点在于对于一个元素的组合(元素+个数),只 ...
- Linux从头学13:想彻底搞懂“系统调用”的底层原理?建议您别错过这篇【调用门】
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作
就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...
- dede5.7 标题长度限制修改
我们经常碰到dede标题长度不够用的问题20个字的标题有时候是真的有点短了网上也有些修改长度问题的帖子,但我发现都不完整所以写下来供大家参考下.免得浪费时间 第一步: 修改下面4处文件: dede目录 ...
- 剑指offer计划25(模拟中等)---java
1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将 ...
- 关于连接服务器redis的教程
第一步:下载RedisDesktopManager 这个百度一搜就有了,但是现在的版本ssh用不了 建议找可以用的版本,这个百度,懂得都懂. 第二步:服务器宝塔redis设置 在配置文件将bind 1 ...