乐趣区

关于开源:更好的-java-重试框架-sisyphus-配置的-2-种方式介绍

回顾

咱们后面学习了

更好的 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 开源地址

心愿本文对你有所帮忙,如果喜爱,欢送点赞珍藏转发一波。

我是老马,期待与你的下次重逢。

退出移动版