java 重試框架 sisyphus 入門介紹
What is Sisyphus
sisyphus 綜合了 spring-retry 和 gauva-retrying 的優(yōu)勢,使用起來也非常靈活。
為什么選擇這個名字
我覺得重試做的事情和西西弗斯很相似。
一遍遍的重復(fù),可能徒勞無功,但是樂此不疲。
人一定要想象西西弗斯的快樂。——加繆
其他原因
以前看了 java retry 的相關(guān)框架,
雖然覺得其中有很多不足之處。但是沒有任何重復(fù)造輪子的沖動,覺得是徒勞無功的。
當然這段時間也看了 Netty 的接口設(shè)計,和 Hibernate-Validator 的接口設(shè)計,覺得非常的巧妙。
覺得把這些東西結(jié)合,可以寫出一個還不錯的框架,就寫了起來。
至少,sisyphus 是快樂的。
關(guān)于版本
這次的框架版本采用了比較保守的方式,使用 0.0.X
。
原因有兩個:
(1)我認為前期出于實驗階段。代碼并不成熟,自測也不充分。所以不適合用于生產(chǎn)。
(2)這樣可以快速迭代,而不至于為了追求更好導(dǎo)致版本特性遲遲無法迭代。
版本特性
我用了 5 個版本,實現(xiàn)了主要的特性:
(1)基于 fluent 接口聲明式調(diào)用
(2)基于 annotation 的代理實現(xiàn)
(3)spring 的整合實現(xiàn)
(4)自定義注解的實現(xiàn)
未完成的工作
- 更方便的工具類。
- 使用文檔
- 測試代碼
感受
想法是很容易產(chǎn)生的,但是想把它變成一個穩(wěn)定的框架需要很長的時間錘煉。
為什么選擇 sisyphus
作為開發(fā)者,我們一般都會選擇比較著名的框架。
比如 guava-retrying spring-retry。
或者干脆自己寫一個。
為什么不是 guava-retrying/spring-retry
java retry 這篇文章中我列舉了常見的實現(xiàn)方式
以及上述的兩種框架,也講述了其中的不足。
guava-retrying 優(yōu)缺點
優(yōu)點
- 使用靈活
- fluent 優(yōu)雅寫法
- 提供足夠多的實現(xiàn)
缺點
沒有默認基于注解的實現(xiàn)
重試策略設(shè)計并不友好
spring-retry
優(yōu)點使用簡單
缺點
- 重試條件單一
- 重試等待策略單一
- 無法自定義注解
為什么不自己寫一個
個人感受
我作為一名開發(fā),平時說實在的,看到重試。
我肯定會偷懶寫一個 for 循環(huán),重試幾次就結(jié)束了。
因為時間不允許。
如果你更勤快一點,就可以選擇 spring-retry/guava-retrying。如果你熟悉他們的優(yōu)缺點的話。
如果你渴望創(chuàng)造
sisyphus 所有的實現(xiàn)都是基于接口的。
你完全可以實現(xiàn)自己的實現(xiàn),所有的東西基本完全可以被替換。
當然一些常見的策略實現(xiàn),項目的基本框架都有詳盡的注釋,當做參考也可以有一點幫助。
sisyphus 做的更多的事情
netty 的靈感
參考了 netty 的設(shè)計,保證接口實現(xiàn)的一致性。
而且 sisyphus 還做了更多,還保證了接口和注解之間的一致性。
使用引導(dǎo)類,保證使用時的便利性,后期拓展的靈活性。
hibernate-validator
hibernate-validator 的作者是我知道為數(shù)不多的對于 java 注解應(yīng)用很棒的開發(fā)者。(雖然所知甚少)
自定義注解就是從這個框架中學(xué)來的。
與 spring 為伍
spring 基本與我們的代碼形影不離,所以你可以很簡單的結(jié)合 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()
創(chuàng)建引導(dǎo)類的實例,String 是 callable 也就是待重試方法的返回值類型。
callable()
指定待重試的方法實現(xiàn)。
retryCall()
觸發(fā)重試調(diào)用。
日志信息
- 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(); }
這些默認值都是可以配置的。
比如什么時候觸發(fā)重試?重試幾次?多久觸發(fā)一次重試?這些都會在下面的章節(jié)進行詳細講解。
小結(jié)
本文簡單介紹了重試框架的設(shè)計緣由,及其使用入門。
到此這篇關(guān)于java 重試框架 sisyphus 入門簡介的文章就介紹到這了,更多相關(guān)java 重試框架 sisyphus 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解
這篇文章主要介紹了Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解,Exchanger是一個用于線程間協(xié)作的工具類,Exchanger用于進行線程間的數(shù)據(jù)交 換,它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數(shù)據(jù),需要的朋友可以參考下2023-12-12Java中final關(guān)鍵字的使用與注意總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中final關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08舉例講解Java設(shè)計模式編程中模板方法模式的運用實例
這篇文章主要介紹了Java設(shè)計模式編程中模板方法模式的運用實例,模板方法模式強調(diào)基于繼承的代碼復(fù)用,需要的朋友可以參考下2016-05-05Java 注冊時發(fā)送激活郵件和激活的實現(xiàn)示例
這篇文章主要介紹了Java 注冊時發(fā)送激活郵件和激活的實現(xiàn)示例的相關(guān)資料,需要的朋友可以參考下2017-07-07