共计 3625 个字符,预计需要花费 10 分钟才能阅读完成。
回顾
咱们后面学习了
更好的 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 开源地址
心愿本文对你有所帮忙,如果喜爱,欢送点赞珍藏转发一波。
我是老马,期待与你的下次重逢。