更好的 java 重試框架 sisyphus 配置的 2 種方式介紹

老馬嘯西風發表於2021-10-28

回顧

我們前面學習了

更好的 java 重試框架 sisyphus 入門簡介

更好的 java 重試框架 sisyphus 背後的故事

這一節讓我們一起學習下 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 開源地址

希望本文對你有所幫助,如果喜歡,歡迎點贊收藏轉發一波。

我是老馬,期待與你的下次重逢。

在這裡插入圖片描述

相關文章