回顾

我们前面学习了

更好的 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. 最长回文子序列---DP

    问题描述 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 解题思路 1.说明 首先要弄清楚回文子串和回文子序列的区别,如果一个字符串是"bbbab", ...

  2. 一、自动化监控利器-Zabbix

    目录 1. 监控的作用 1.1 为何需要监控系统 1.2 监控系统的实现 1.3 常用的监控软件 2. Zabbix简介 2.1 选择Zabbix的理由 2.2 Zabbix的功能特性 3. Zabb ...

  3. Python常见问题 - python3 使用requests发送HTTPS请求报certificate verify failed 错误

    当你使用 requests 发送HTTPS请求时 requests.get(url, parmas=parmas, headers=header, cookies=cookie) 出现了以下错误 HT ...

  4. kernel_thread()和kthread_run()/kthread_create()的根本区别

    0 本质区别 kthread_run()调用kthread_create(), kthread_create()加入链表后,有kthreadd()线程读取链表然后再调用kernel_thread()创 ...

  5. 10分钟学会VS NuGet包私有化部署

    前言 我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的. 命令版本:10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(ne ...

  6. FastAPI 学习之路(一)fastapi--高性能web开发框架

    fastapi是高性能的web框架.他的主要特点是:- 快速编码- 减少人为bug- 直观- 简易- 具有交互式文档 - 高性能 - 基于API的开放标准 支持python 3.6版本. 安装 pip ...

  7. golang isPowerOfTwo判断是否是2的幂

    iota.go   strconv包 func isPowerOfTwo(x int) bool { return x & (x -1) } 了解n&(n-1)的作用如下: n& ...

  8. [第十八篇]——Docker 安装 Node.js之Spring Cloud大型企业分布式微服务云架构源码

    Docker 安装 Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,是一个让 JavaScript 运行在服务端的开发平台. 1.查看可用的 N ...

  9. eclipse中的一些快捷键

    1.内容提示 Alt+/ 2.快速修复 ctrl+/ 3.导包 ctrl+shift+o 4.格式代码块 ctrl+shift+o 5.向前向后 Alt+方向键 6.添加注释 ctrl+shift+/ ...

  10. Docker系列(21)- DockerFile介绍

    DockerFile介绍 dockerfile是用来构建docker镜像的文件!命令参数脚本! 构建步骤 编写一个dockerfile文件 docker build构建成为一个镜像 docker ru ...