java 重試框架 sisyphus 入門(mén)介紹
What is Sisyphus
sisyphus 綜合了 spring-retry 和 gauva-retrying 的優(yōu)勢(shì),使用起來(lái)也非常靈活。
為什么選擇這個(gè)名字
我覺(jué)得重試做的事情和西西弗斯很相似。
一遍遍的重復(fù),可能徒勞無(wú)功,但是樂(lè)此不疲。
人一定要想象西西弗斯的快樂(lè)?!涌?/p>
其他原因
以前看了 java retry 的相關(guān)框架,
雖然覺(jué)得其中有很多不足之處。但是沒(méi)有任何重復(fù)造輪子的沖動(dòng),覺(jué)得是徒勞無(wú)功的。
當(dāng)然這段時(shí)間也看了 Netty 的接口設(shè)計(jì),和 Hibernate-Validator 的接口設(shè)計(jì),覺(jué)得非常的巧妙。
覺(jué)得把這些東西結(jié)合,可以寫(xiě)出一個(gè)還不錯(cuò)的框架,就寫(xiě)了起來(lái)。
至少,sisyphus 是快樂(lè)的。
關(guān)于版本
這次的框架版本采用了比較保守的方式,使用 0.0.X。
原因有兩個(gè):
(1)我認(rèn)為前期出于實(shí)驗(yàn)階段。代碼并不成熟,自測(cè)也不充分。所以不適合用于生產(chǎn)。
(2)這樣可以快速迭代,而不至于為了追求更好導(dǎo)致版本特性遲遲無(wú)法迭代。
版本特性
我用了 5 個(gè)版本,實(shí)現(xiàn)了主要的特性:
(1)基于 fluent 接口聲明式調(diào)用
(2)基于 annotation 的代理實(shí)現(xiàn)
(3)spring 的整合實(shí)現(xiàn)
(4)自定義注解的實(shí)現(xiàn)
未完成的工作
- 更方便的工具類(lèi)。
- 使用文檔
- 測(cè)試代碼
感受
想法是很容易產(chǎn)生的,但是想把它變成一個(gè)穩(wěn)定的框架需要很長(zhǎng)的時(shí)間錘煉。
為什么選擇 sisyphus
作為開(kāi)發(fā)者,我們一般都會(huì)選擇比較著名的框架。
比如 guava-retrying spring-retry。
或者干脆自己寫(xiě)一個(gè)。
為什么不是 guava-retrying/spring-retry
java retry 這篇文章中我列舉了常見(jiàn)的實(shí)現(xiàn)方式
以及上述的兩種框架,也講述了其中的不足。
guava-retrying 優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 使用靈活
- fluent 優(yōu)雅寫(xiě)法
- 提供足夠多的實(shí)現(xiàn)
缺點(diǎn)
沒(méi)有默認(rèn)基于注解的實(shí)現(xiàn)
重試策略設(shè)計(jì)并不友好
spring-retry
優(yōu)點(diǎn)使用簡(jiǎn)單
缺點(diǎn)
- 重試條件單一
- 重試等待策略單一
- 無(wú)法自定義注解
為什么不自己寫(xiě)一個(gè)
個(gè)人感受
我作為一名開(kāi)發(fā),平時(shí)說(shuō)實(shí)在的,看到重試。
我肯定會(huì)偷懶寫(xiě)一個(gè) for 循環(huán),重試幾次就結(jié)束了。
因?yàn)闀r(shí)間不允許。
如果你更勤快一點(diǎn),就可以選擇 spring-retry/guava-retrying。如果你熟悉他們的優(yōu)缺點(diǎn)的話。
如果你渴望創(chuàng)造
sisyphus 所有的實(shí)現(xiàn)都是基于接口的。
你完全可以實(shí)現(xiàn)自己的實(shí)現(xiàn),所有的東西基本完全可以被替換。
當(dāng)然一些常見(jiàn)的策略實(shí)現(xiàn),項(xiàng)目的基本框架都有詳盡的注釋?zhuān)?dāng)做參考也可以有一點(diǎn)幫助。
sisyphus 做的更多的事情
netty 的靈感
參考了 netty 的設(shè)計(jì),保證接口實(shí)現(xiàn)的一致性。
而且 sisyphus 還做了更多,還保證了接口和注解之間的一致性。
使用引導(dǎo)類(lèi),保證使用時(shí)的便利性,后期拓展的靈活性。
hibernate-validator
hibernate-validator 的作者是我知道為數(shù)不多的對(duì)于 java 注解應(yīng)用很棒的開(kāi)發(fā)者。(雖然所知甚少)
自定義注解就是從這個(gè)框架中學(xué)來(lái)的。
與 spring 為伍
spring 基本與我們的代碼形影不離,所以你可以很簡(jiǎn)單的結(jié)合 spring.
就像你使用 spring-retry 一樣。
快速開(kāi)始
需要
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>
編碼
作為入門(mén)案例,我們首先介紹些簡(jiǎn)單靈活的聲明式編程
public void helloTest() {
Retryer.<String>newInstance()
.callable(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("called...");
throw new RuntimeException();
}
}).retryCall();
}
代碼簡(jiǎn)介
Retryer.<String>newInstance() 創(chuàng)建引導(dǎo)類(lèi)的實(shí)例,String 是 callable 也就是待重試方法的返回值類(lèi)型。
callable() 指定待重試的方法實(shí)現(xiàn)。
retryCall() 觸發(fā)重試調(diào)用。
日志信息
- called...
- called...
- called...
以及一些異常信息。
等價(jià)配置
上面的配置其實(shí)有很多默認(rèn)值,如下:
/**
* 默認(rèn)配置測(cè)試
*/
@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();
}
這些默認(rèn)值都是可以配置的。
比如什么時(shí)候觸發(fā)重試?重試幾次?多久觸發(fā)一次重試?這些都會(huì)在下面的章節(jié)進(jìn)行詳細(xì)講解。
小結(jié)
本文簡(jiǎn)單介紹了重試框架的設(shè)計(jì)緣由,及其使用入門(mén)。
到此這篇關(guān)于java 重試框架 sisyphus 入門(mén)簡(jiǎn)介的文章就介紹到這了,更多相關(guān)java 重試框架 sisyphus 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容
這篇文章主要介紹了如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
用StopWatch優(yōu)雅替代currentTimeMillis計(jì)算程序執(zhí)行耗時(shí)
別再用System.currentTimeMillis()計(jì)算程序執(zhí)行耗時(shí)了,擁抱StopWatch優(yōu)雅來(lái)優(yōu)雅的計(jì)算,代碼更簡(jiǎn)潔效率更高,本文帶你了解StopWatch的使用2021-09-09
JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過(guò)程
學(xué)生信息管理系統(tǒng)是針對(duì)學(xué)校人事處的大量業(yè)務(wù)處理工作而開(kāi)發(fā)的管理軟件,主要用于學(xué)校學(xué)生信息管理,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過(guò)程,需要的朋友可以參考下2023-05-05
Mybatis使用@one和@Many實(shí)現(xiàn)一對(duì)一及一對(duì)多關(guān)聯(lián)查詢
本文主要介紹了Mybatis使用@one和@Many實(shí)現(xiàn)一對(duì)一及一對(duì)多關(guān)聯(lián)查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
解決MyEclipse10.7部署報(bào)錯(cuò)拋空指針異常問(wèn)題的方法
這篇文章主要介紹了解決MyEclipse10.7部署報(bào)錯(cuò)拋空指針異常問(wèn)題的方法,需要的朋友可以參考下2015-12-12
解決Properties屬性文件中的值有等號(hào)和換行的小問(wèn)題
這篇文章主要介紹了解決Properties屬性文件中的值有等號(hào)有換行的小問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java實(shí)現(xiàn)表單提交(支持多文件同時(shí)上傳)
本文介紹了Java、Android實(shí)現(xiàn)表單提交(支持多文件同時(shí)上傳)的方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01

