回顧
我們前面學習了
這一節讓我們一起學習下 sisyphus 基於函式式的配置和註解式的配置。
函式式配置概覽
為了滿足更加方便的配置,Retryer 類提供了許多可以配置的資訊。
預設配置
/**
* 預設配置測試
*/
public void defaultConfigTest() {
Retryer.<String>newInstance()
.condition(RetryConditions.hasExceptionCause())
.retryWaitContext(RetryWaiter.<String>retryWait(NoRetryWait.class).context())
.maxAttempt(3)
.listen(RetryListens.noListen())
.recover(Recovers.noRecover())
.callable(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("called...");
throw new RuntimeException();
}
}).retryCall();
}
和下面的程式碼是等價的:
public void helloTest() {
Retryer.<String>newInstance()
.callable(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("called...");
throw new RuntimeException();
}
}).retryCall();
}
方法說明
condition
重試觸發的條件,可以指定多個條件。
預設為丟擲異常。
retryWaitContext
重試等待的策略,可以指定多個。
預設為不做任何等待。
maxAttempt
指定最大重試次數,包括第一次執行。
預設值:3 次。
listen
指定重試的監聽實現,預設為不做監聽。
recover
當重試完成之後,依然滿足重試條件,則可以指定恢復的策略。
預設不做恢復。
callable
待重試執行的方法。
retryCall
觸發重試執行。
介面的詳細介紹
介面及其實現
所有的介面,都可以直接檢視對應的子類例項。
使用者自定義
基於替換的靈活性,使用者可以實現介面,定義更符合自己業務的實現。
sisyphus 註解
配置具有很高的靈活性,但是對於開發人員的使用,就沒有註解那樣簡單靈活。
所以本框架也實現了基於註解的重試。
設計的規範
保證介面和註解二者的統一性。
maven 引入
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>sisyphus-annotation</artifactId>
<version>${project.version}</version>
</dependency>
註解
核心註解主要有兩個。
Retry
用於指定重試的相關配置。
/**
* 重試註解
* 1. 實際需要,只允許放在方法上。
* 2. 如果放在介面上,是否所有的子類都生效?為了簡單明確,不提供這種實現。
* 3. 保持註解和介面的一致性。{@link com.github.houbb.sisyphus.api.core.Retry} 介面
* @author binbin.hou
* @since 0.0.3
*/
@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@RetryAble(DefaultRetryAbleHandler.class)
public @interface Retry {
/**
* 重試類實現
* @return 重試
* @since 0.0.5
*/
Class<? extends com.github.houbb.sisyphus.api.core.Retry> retry() default DefaultRetry.class;
/**
* 最大嘗試次數
* 1. 包含方法第一次正常執行的次數
* @return 次數
*/
int maxAttempt() default 3;
/**
* 重試觸發的場景
* @return 重試觸發的場景
*/
Class<? extends RetryCondition> condition() default ExceptionCauseRetryCondition.class;
/**
* 監聽器
* 1. 預設不進行監聽
* @return 監聽器
*/
Class<? extends RetryListen> listen() default NoRetryListen.class;
/**
* 恢復操作
* 1. 預設不進行任何恢復操作
* @return 恢復操作對應的類
*/
Class<? extends Recover> recover() default NoRecover.class;
/**
* 等待策略
* 1. 支援指定多個,如果不指定,則不進行任何等待,
* @return 等待策略
*/
RetryWait[] waits() default {};
}
RetryWait
用於指定重試的等待策略。
package com.github.houbb.sisyphus.annotation.annotation;
import com.github.houbb.sisyphus.annotation.annotation.metadata.RetryWaitAble;
import com.github.houbb.sisyphus.annotation.handler.impl.DefaultRetryWaitAbleHandler;
import com.github.houbb.sisyphus.core.constant.RetryWaitConst;
import com.github.houbb.sisyphus.core.support.wait.NoRetryWait;
import java.lang.annotation.*;
/**
* 重試等待策略
* 1. 為了對應重試策略,所有的內建註解應該實現當前的註解。
* 2. 是否允許自定義註解?
*
* 當註解+物件同時出現的時候,視為組合。
*
* @author binbin.hou
* @since 0.0.3
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.ANNOTATION_TYPE)
@RetryWaitAble(DefaultRetryWaitAbleHandler.class)
public @interface RetryWait {
/**
* 預設值
* 1. fixed 模式,則對應固定等待時間
* 2. 遞增
* @return 預設值
*/
long value() default RetryWaitConst.VALUE_MILLS;
/**
* 最小值
* @return 最小值
*/
long min() default RetryWaitConst.MIN_MILLS;
/**
* 最大值
* @return 最大值
*/
long max() default RetryWaitConst.MAX_MILLS;
/**
* 影響因數
* 1. 遞增重試,預設為 {@link RetryWaitConst#INCREASE_MILLS_FACTOR}
* 2. 指數模式。預設為 {@link RetryWaitConst#MULTIPLY_FACTOR}
* @return 影響因數
*/
double factor() default Double.MIN_VALUE;
/**
* 指定重試的等待時間 class 資訊
* @return 重試等待時間 class
*/
Class<? extends com.github.houbb.sisyphus.api.support.wait.RetryWait> retryWait() default NoRetryWait.class;
}
註解的使用
定義好了註解,肯定要有註解的相關使用。
關於註解的使用,主要有兩種方式。
Proxy+CGLIB
基於代理模式和位元組碼增強。
如果是專案中沒有使用 spring,直接使用這種方式比較方便。
Spring-AOP
可以和 spring 直接整合。
使用方式和 spring-retry 是一樣的。
這些內容將放在下一節進行詳細講解。
小結
靈活的配置才能更加符合實際生產使用中的各種需求。
一般實際使用推薦使用註解的配置方式,非常的簡單方便。
java 重試框架 sisyphus 開源地址
希望本文對你有所幫助,如果喜歡,歡迎點贊收藏轉發一波。
我是老馬,期待與你的下次重逢。