回顾

我们前面学习了

更好的 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>() {@Overridepublic String call() throws Exception {System.out.println("called...");throw new RuntimeException();}}).retryCall();
}

和下面的代码是等价的:

public void helloTest() {Retryer.<String>newInstance().callable(new Callable<String>() {@Overridepublic 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 开源地址

希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。

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

更好的 java 重试框架 sisyphus 配置的 2 种方式介绍相关推荐

  1. java 连接池配置_java数据库连接池配置的几种方式

    关于java数据库连接池配置的几种方式 今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下 ...

  2. java mvc controller_java之spring mvc之Controller配置的几种方式

    这篇主要讲解 controller配置的几种方式. 1. URL对应 Bean 如果要使用此类配置方式,需要在XML中做如下样式配置 2. 为 URL 分配 Bean 使用一个统一配置集合,对各个 U ...

  3. Spring事务配置的五种方式 说明

    Spring事务配置的五种方式  [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...

  4. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  5. 【java】Java运行时动态生成类几种方式

    1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...

  6. Java中遍历Map集合的5种方式总结

    这篇文章主要给大家介绍了关于Java中遍历Map集合的5种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 方式一 通过Map.keySet使用iterator遍历 ...

  7. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  8. springboot 多数据源配置的几种方式

    springboot多数据源配置的三种方式 application.yml配置 1.@Ds("配置数据源名称") 引入依赖 <dependency> <group ...

  9. java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  10. php框架中什么是渲染,thinkPHP5框架渲染模板的3种方式简述

    本文实例讲述了thinkPHP5框架渲染模板的3种方式.分享给大家供大家参考,具体如下: 默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出. 在 ...

最新文章

  1. PMP-【第14章 五大过程组的工作要点】2021-2-17(292页-303页)
  2. dnscapy使用——本质上是建立ssh的代理(通过dns tunnel)
  3. AWS Ubuntu安装可视化操作桌面和VS Code,Code Server
  4. 一个很SB的方法,来开始调一个刚启动就SB的程序
  5. 利用Sqoop将MySQL海量测试数据导入HDFS和HBase
  6. Java中删除文件、删除目录及目录下所有文件
  7. 英雄联盟祖安服务器位置,LOL“4区版英雄联盟”:城区有2个,郊区有2个,山区有1个...
  8. Docker运行操作系统环境(BusyBoxAlpineDebian/UbuntuCentOS/Fedora)
  9. svn 中 版本回退
  10. 全面解析js中的for循环
  11. 使用 Python 批量下载喜马拉雅有声书音频
  12. 常见图片格式总结--网页设计必备
  13. 论文写作流程图软件_[转载][强烈推荐]论文写作四助手(四个论文写作软件)...
  14. 为什么要测款,直通车测款怎样设置
  15. Android px转dip px转sp法则
  16. 小红书引流推广的终极秘籍之笔记排名
  17. Python 脚本帮你找出微信上删除了你的“好友“
  18. python文档生成_python文档生成工具:pydoc、sphinx;django如何使用sphinx?
  19. 宝塔面板 - BT面板 Linux Centos 命令集
  20. [unknown OJ] 客星璀璨之夜

热门文章

  1. eclipse出现the user operation is waitting for background work to complete异常
  2. linux安装mysql总结
  3. Androidstudio 连接夜神模拟器
  4. redis.conf文件下载与配置
  5. “有意思”的英语单词(5)
  6. 天道酬勤,仅仅两年,我便做上了那个测试老大···
  7. 我的权限控制(JBX + struts + hibernate + ORACLE)
  8. Travel around the UK
  9. clustalw序列比对_序列比较中ClustalW和BLAST的区别
  10. php zip压缩包下载