回顾

我们前面学习了

更好的 java 重试框架 sisyphus 入门简介

更好的 java 重试框架 sisyphus 背后的故事

这一节让我们一起学习下 sisyphus 基于函数式的配置和注解式的配置。

函数式配置概览

为了满足更加方便的配置,Retryer 类提供了许多可以配置的信息。

默认配置

  1. /**
  2. * 默认配置测试
  3. */
  4. public void defaultConfigTest() {
  5. Retryer.<String>newInstance()
  6. .condition(RetryConditions.hasExceptionCause())
  7. .retryWaitContext(RetryWaiter.<String>retryWait(NoRetryWait.class).context())
  8. .maxAttempt(3)
  9. .listen(RetryListens.noListen())
  10. .recover(Recovers.noRecover())
  11. .callable(new Callable<String>() {
  12. @Override
  13. public String call() throws Exception {
  14. System.out.println("called...");
  15. throw new RuntimeException();
  16. }
  17. }).retryCall();
  18. }

和下面的代码是等价的:

  1. public void helloTest() {
  2. Retryer.<String>newInstance()
  3. .callable(new Callable<String>() {
  4. @Override
  5. public String call() throws Exception {
  6. System.out.println("called...");
  7. throw new RuntimeException();
  8. }
  9. }).retryCall();
  10. }

方法说明

condition

重试触发的条件,可以指定多个条件。

默认为抛出异常。

retryWaitContext

重试等待的策略,可以指定多个。

默认为不做任何等待。

maxAttempt

指定最大重试次数,包括第一次执行。

默认值:3 次。

listen

指定重试的监听实现,默认为不做监听。

recover

当重试完成之后,依然满足重试条件,则可以指定恢复的策略。

默认不做恢复。

callable

待重试执行的方法。

retryCall

触发重试执行。

接口的详细介绍

接口及其实现

所有的接口,都可以直接查看对应的子类实例。

用户自定义

基于替换的灵活性,用户可以实现接口,定义更符合自己业务的实现。

sisyphus 注解

配置具有很高的灵活性,但是对于开发人员的使用,就没有注解那样简单灵活。

所以本框架也实现了基于注解的重试。

设计的规范

保证接口和注解二者的统一性。

maven 引入

  1. <dependency>
  2. <groupId>${project.groupId}</groupId>
  3. <artifactId>sisyphus-annotation</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>

注解

核心注解主要有两个。

Retry

用于指定重试的相关配置。

  1. /**
  2. * 重试注解
  3. * 1. 实际需要,只允许放在方法上。
  4. * 2. 如果放在接口上,是否所有的子类都生效?为了简单明确,不提供这种实现。
  5. * 3. 保持注解和接口的一致性。{@link com.github.houbb.sisyphus.api.core.Retry} 接口
  6. * @author binbin.hou
  7. * @since 0.0.3
  8. */
  9. @Documented
  10. @Inherited
  11. @Target(ElementType.METHOD)
  12. @Retention(RetentionPolicy.RUNTIME)
  13. @RetryAble(DefaultRetryAbleHandler.class)
  14. public @interface Retry {
  15. /**
  16. * 重试类实现
  17. * @return 重试
  18. * @since 0.0.5
  19. */
  20. Class<? extends com.github.houbb.sisyphus.api.core.Retry> retry() default DefaultRetry.class;
  21. /**
  22. * 最大尝试次数
  23. * 1. 包含方法第一次正常执行的次数
  24. * @return 次数
  25. */
  26. int maxAttempt() default 3;
  27. /**
  28. * 重试触发的场景
  29. * @return 重试触发的场景
  30. */
  31. Class<? extends RetryCondition> condition() default ExceptionCauseRetryCondition.class;
  32. /**
  33. * 监听器
  34. * 1. 默认不进行监听
  35. * @return 监听器
  36. */
  37. Class<? extends RetryListen> listen() default NoRetryListen.class;
  38. /**
  39. * 恢复操作
  40. * 1. 默认不进行任何恢复操作
  41. * @return 恢复操作对应的类
  42. */
  43. Class<? extends Recover> recover() default NoRecover.class;
  44. /**
  45. * 等待策略
  46. * 1. 支持指定多个,如果不指定,则不进行任何等待,
  47. * @return 等待策略
  48. */
  49. RetryWait[] waits() default {};
  50. }

RetryWait

用于指定重试的等待策略。

  1. package com.github.houbb.sisyphus.annotation.annotation;
  2. import com.github.houbb.sisyphus.annotation.annotation.metadata.RetryWaitAble;
  3. import com.github.houbb.sisyphus.annotation.handler.impl.DefaultRetryWaitAbleHandler;
  4. import com.github.houbb.sisyphus.core.constant.RetryWaitConst;
  5. import com.github.houbb.sisyphus.core.support.wait.NoRetryWait;
  6. import java.lang.annotation.*;
  7. /**
  8. * 重试等待策略
  9. * 1. 为了对应重试策略,所有的内置注解应该实现当前的注解。
  10. * 2. 是否允许自定义注解?
  11. *
  12. * 当注解+对象同时出现的时候,视为组合。
  13. *
  14. * @author binbin.hou
  15. * @since 0.0.3
  16. */
  17. @Retention(RetentionPolicy.RUNTIME)
  18. @Inherited
  19. @Documented
  20. @Target(ElementType.ANNOTATION_TYPE)
  21. @RetryWaitAble(DefaultRetryWaitAbleHandler.class)
  22. public @interface RetryWait {
  23. /**
  24. * 默认值
  25. * 1. fixed 模式,则对应固定等待时间
  26. * 2. 递增
  27. * @return 默认值
  28. */
  29. long value() default RetryWaitConst.VALUE_MILLS;
  30. /**
  31. * 最小值
  32. * @return 最小值
  33. */
  34. long min() default RetryWaitConst.MIN_MILLS;
  35. /**
  36. * 最大值
  37. * @return 最大值
  38. */
  39. long max() default RetryWaitConst.MAX_MILLS;
  40. /**
  41. * 影响因数
  42. * 1. 递增重试,默认为 {@link RetryWaitConst#INCREASE_MILLS_FACTOR}
  43. * 2. 指数模式。默认为 {@link RetryWaitConst#MULTIPLY_FACTOR}
  44. * @return 影响因数
  45. */
  46. double factor() default Double.MIN_VALUE;
  47. /**
  48. * 指定重试的等待时间 class 信息
  49. * @return 重试等待时间 class
  50. */
  51. Class<? extends com.github.houbb.sisyphus.api.support.wait.RetryWait> retryWait() default NoRetryWait.class;
  52. }

注解的使用

定义好了注解,肯定要有注解的相关使用。

关于注解的使用,主要有两种方式。

Proxy+CGLIB

基于代理模式和字节码增强。

如果是项目中没有使用 spring,直接使用这种方式比较方便。

Spring-AOP

可以和 spring 直接整合。

使用方式和 spring-retry 是一样的。

这些内容将放在下一节进行详细讲解。

小结

灵活的配置才能更加符合实际生产使用中的各种需求。

一般实际使用推荐使用注解的配置方式,非常的简单方便。

java 重试框架 sisyphus 开源地址

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

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

更好的 java 重试框架 sisyphus 配置的 2 种方式介绍的更多相关文章

  1. 更好的 java 重试框架 sisyphus 的 3 种使用方式

    回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍 更好的 java 重试框架 sisyphus 背后的 ...

  2. 更好的 java 重试框架 sisyphus 背后的故事

    sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 今天,让我们一起看一下西西弗斯背后的故事. 情景导入 简单的需求 产品经理:实现一个 ...

  3. 更好的 java 重试框架 sisyphus 入门简介

    What is Sisyphus sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 为什么选择这个名字 我觉得重试做的事情和西西弗斯很 ...

  4. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

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

    这篇主要讲解 controller配置的几种方式. 1. URL对应 Bean 如果要使用此类配置方式,需要在XML中做如下样式配置 <!-- 配置handlerMapping --> & ...

  6. spring配置datasource三种方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp34 spring配置datasource三种方式 1.使用org.spri ...

  7. 【Spring】SpringMVC非注解配置的两种方式

    目录结构: contents structure [+] SpringMVC是什么 Spring MVC的设计原理 SpringMVC配置的第一种方式 1,复制Jar包 2,Web.xml文件 3,M ...

  8. Spring事务配置的五种方式(转发)

    Spring事务配置的五种方式(原博客地址是http://www.blogjava.net/robbie/archive/2009/04/05/264003.html)挺好的,收藏转发 前段时间对Sp ...

  9. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

随机推荐

  1. java IO操作,看完你应该就清晰了。

    前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...

  2. jvm学习笔记:类加载过程

    类加载器子系统 类加载器的作用是加载class文件到内存 加载阶段->链接阶段->初始化阶段 ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断 加载的类信息 ...

  3. Apache配置与应用

    目录: 一.基于域名的虚拟主机 二.基于IP地址的虚拟主机 三.基于端口的虚拟主机 四.Apache连接保持 五.构建Web虚拟目录与用户授权限制 六.Apache日志分割 七.AWStats 分析系 ...

  4. python函数模块

    python函数模块 学习完本篇,你将会深入掌握 函数相关知识 1.函数定义 2.函数如何调用 3.递归函数以及匿名函数使用 模块相关知识 1.模块如何导入调用 2.函数调用顺序 函数定义 函数代码块 ...

  5. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul

    相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...

  6. dede调用文章内第一张原始图片(非缩略图)的实现方法

    第一步,修改include/extend.func.php文件,最下面插入函数,查询的是文章附加表,如需查询图片集什么的,改表名即可 //取原图地址 function GetFirstImg($arc ...

  7. VS 2019下载、安装与注册包含MF、界面美化和安装Visual Assist

    下载: 1.在搜索框中输入"微软" 2. 3. 安装: 1.双击运行-继续-等待安装完成 2. 3.安装完后,重启电脑,并创建快捷方式. 注册: 1.打开软件 2. 3. 4.网上 ...

  8. Nginx系列(8)- Nginx安装 | Docker环境下部署

    Docker环境下部署Nginx https://www.cnblogs.com/gltou/p/15186971.html

  9. @Valid注解的一点理解

    @Valid注解存在于spring-boot-starter-web包下,只要项目中存在该依赖就无需自行导入,也就是说该注解适用于springboot项目此注解用于表单验证,简化了判断代码用法:格式如 ...

  10. 生动直观的Gif图告诉你如何安装Python安装第3方库,在线安装离线安装全都搞定

    前言 学Python的小伙伴都知道,Python学习过程中需要装不少的第3方的库,今天就和大家一起分享下第3方库的安装方法 在线安装(推荐安装式式) 点开Pycharm--file--Project- ...