java 重试框架 sisyphus 入门介绍

What is Sisyphus

sisyphus综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活。

为什么选择这个名字

我觉得重试做的事情和西西弗斯很相似。

一遍遍的重复,可能徒劳无功,但是乐此不疲。

人一定要想象西西弗斯的快乐。——加缪

其他原因

以前看了 java retry 的相关框架,
虽然觉得其中有很多不足之处。但是没有任何重复造轮子的冲动,觉得是徒劳无功的。

当然这段时间也看了 Netty 的接口设计,和 Hibernate-Validator 的接口设计,觉得非常的巧妙。

觉得把这些东西结合,可以写出一个还不错的框架,就写了起来。

至少,sisyphus 是快乐的。

关于版本

这次的框架版本采用了比较保守的方式,使用 0.0.X

原因有两个:

(1)我认为前期出于实验阶段。代码并不成熟,自测也不充分。所以不适合用于生产。

(2)这样可以快速迭代,而不至于为了追求更好导致版本特性迟迟无法迭代。

版本特性

我用了 5 个版本,实现了主要的特性:

(1)基于 fluent 接口声明式调用

(2)基于 annotation 的代理实现

(3)spring 的整合实现

(4)自定义注解的实现

未完成的工作

  • 更方便的工具类。
  • 使用文档
  • 测试代码

感受

想法是很容易产生的,但是想把它变成一个稳定的框架需要很长的时间锤炼。

为什么选择 sisyphus

作为开发者,我们一般都会选择比较著名的框架。

比如 guava-retrying spring-retry。

或者干脆自己写一个。

为什么不是 guava-retrying/spring-retry

java retry 这篇文章中我列举了常见的实现方式
以及上述的两种框架,也讲述了其中的不足。

guava-retrying 优缺点

优点

  • 使用灵活
  • fluent 优雅写法
  • 提供足够多的实现

缺点

没有默认基于注解的实现

重试策略设计并不友好

spring-retry

优点使用简单

缺点

  • 重试条件单一
  • 重试等待策略单一
  • 无法自定义注解

为什么不自己写一个

个人感受

我作为一名开发,平时说实在的,看到重试。

我肯定会偷懒写一个 for 循环,重试几次就结束了。

因为时间不允许。

如果你更勤快一点,就可以选择 spring-retry/guava-retrying。如果你熟悉他们的优缺点的话。

如果你渴望创造

sisyphus 所有的实现都是基于接口的。

你完全可以实现自己的实现,所有的东西基本完全可以被替换。

当然一些常见的策略实现,项目的基本框架都有详尽的注释,当做参考也可以有一点帮助。

sisyphus 做的更多的事情

netty 的灵感

参考了 netty 的设计,保证接口实现的一致性。

而且 sisyphus 还做了更多,还保证了接口和注解之间的一致性。

使用引导类,保证使用时的便利性,后期拓展的灵活性。

hibernate-validator

hibernate-validator 的作者是我知道为数不多的对于 java 注解应用很棒的开发者。(虽然所知甚少)

自定义注解就是从这个框架中学来的。

与 spring 为伍

spring 基本与我们的代码形影不离,所以你可以很简单的结合 spring.

就像你使用 spring-retry 一样。

快速开始

需要

jdk1.7+

maven 3.x+

maven 引入

sisyphus 使用 maven 管理 jar,

<plugin>
    <groupId>com.github.houbb</groupId>
    <artifactId>sisyphus-core</artifactId>
    <version>0.0.6</version>
</plugin>

编码

作为入门案例,我们首先介绍些简单灵活的声明式编程

public void helloTest() {
    Retryer.<String>newInstance()
            .callable(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    System.out.println("called...");
                    throw new RuntimeException();
                }
            }).retryCall();
}

代码简介

Retryer.<String>newInstance() 创建引导类的实例,String 是 callable 也就是待重试方法的返回值类型。

callable() 指定待重试的方法实现。

retryCall() 触发重试调用。

日志信息

  • called...
  • called...
  • called...

以及一些异常信息。

等价配置

上面的配置其实有很多默认值,如下:

/**
 * 默认配置测试
 */
@Test(expected = RuntimeException.class)
public void defaultConfigTest() {
    Retryer.<String>newInstance()
            .maxAttempt(3)
            .listen(RetryListens.noListen())
            .recover(Recovers.noRecover())
            .condition(RetryConditions.hasExceptionCause())
            .retryWaitContext(RetryWaiter.<String>retryWait(NoRetryWait.class).context())
            .callable(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    System.out.println("called...");
                    throw new RuntimeException();
                }
            }).retryCall();
}

这些默认值都是可以配置的。

比如什么时候触发重试?重试几次?多久触发一次重试?这些都会在下面的章节进行详细讲解。

小结

本文简单介绍了重试框架的设计缘由,及其使用入门。

java 重试框架 sisyphus 开源地址

到此这篇关于java 重试框架 sisyphus 入门简介的文章就介绍到这了,更多相关java 重试框架 sisyphus 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Java Spring框架中使用的设计模式有哪些

    目录 1 简单工厂模式 2 工厂方法模式 3 单例模式 4 代理模式 好处 静态代理 动态代理 1 简单工厂模式 当A对象需要调用B对象的方法时,我们需要在A中new一个B的实例,我们把这种方式叫作硬编码耦合,缺点是一旦需求发生变化,比如需要使用C类来代替B时,就要改写A类的方法. 假如应用中有上千个类以硬编码的方式耦合了B,改就很头疼. 于是有了简单工厂模式,又叫静态工厂方法,就是由一个工厂类根据传入参数,动态决定应该创建哪个产品类. Spring中的BeanFactory就是简单工厂模式的体

  • Java框架---Spring详解

    目录 一 技术发展 二 框架设计 Spring Framework 6大模块 三 Spring AOP详解 AOP两种方式 四 Spring Bean核心原理 Bean的加载过程 五 Spring XML配置原理 六 Spring Messaging相关技术 七 总结 一 技术发展 技术的创新和发展都是为了解决一类问题 二 框架设计 Spring Framework 6大模块 三 Spring AOP详解 循环依赖问题如何处理? 打破依赖 / 超时推出机制 AOP两种方式 字节码增强技术 四 S

  • Java框架之Maven SSM集合

    目录 SSM Maven 什么是maven Maven好处,为什么要用Maven 三种仓库 坐标概念 总结 SSM @Controller,@Service本质都是@Component,作用是new对象放到Spring容器里. controller层 @Controller//controller层专属注解 @RequestMapping("/student") public class StudentController { @Autowired private IStudentSe

  • Java集合框架入门之泛型和包装类

    目录 1. 预备知识-泛型(Generic) 1.1 泛型的引入 1.2 泛型的分类 1.3 泛型类的定义 1.4 泛型编译的机制 2. 预备知识-包装类(Wrapper Class) 2.1 基本数据类型和包装类的对应关系 2.2 包装类介绍 2.3 装箱(boxing)和拆箱(unboxing) 2.4 自动装箱(autoboxing)和自动拆箱(autounboxing) 2.5 包装类面试题 前言: 本章主要是为了后面学习集合框架所做的知识补充.补充了泛型以及包装类两个知识,但是该章泛型

  • java 重试框架 sisyphus 入门介绍

    What is Sisyphus sisyphus综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 为什么选择这个名字 我觉得重试做的事情和西西弗斯很相似. 一遍遍的重复,可能徒劳无功,但是乐此不疲. 人一定要想象西西弗斯的快乐.--加缪 其他原因 以前看了 java retry 的相关框架, 虽然觉得其中有很多不足之处.但是没有任何重复造轮子的冲动,觉得是徒劳无功的. 当然这段时间也看了 Netty 的接口设计,和 Hibernate-Valid

  • Java 重试框架 Sisyphus 配置的两种方式

    目录 1.函数式配置概览 1.1 默认配置 2.方法说明 2.1 condition 2.2 retryWaitContext 2.3 maxAttempt 2.4 listen 2.5 recover 2.6 callable 2.7 retryCall 3.接口的详细介绍 3.1 接口及其实现 3.2 用户自定义 3.3 sisyphus 注解 4.设计的规范 4.1 maven 引入 4.2 Retry 4.3 RetryWait 5.注解的使用 5.1 Proxy+CGLIB 5.2 S

  • C++ 测试框架GoogleTest入门介绍

    目录 引言 简单介绍 初体验 引言 开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题.那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试框架 GoogleTest. 简单介绍 来看看谷歌官方是怎么介绍这个框架的: Googletest 是由测试技术团队根据 Google 的特定要求和约束开发的测试框架.无论您是在 Linux,Windows 还是 Mac 上工作,如果您编写 C++ 代码,googletest 都可以

  • Java Mybatis框架入门基础教程

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

  • 快速入门HarmonyOS的Java UI框架的教程

    本文档适用于HarmonyOS应用开发的初学者.编写两个简单的页面,实现在第一个页面点击按钮跳转到第二个页面. 注意:运行Hello World在创建工程时,设备类型和模板分别以Wearable和Empty Feature Ability(Java)为例,本文档也基于相同的设备类型和模板进行说明. 编写第一个页面 在Java UI框架中,提供了两种编写布局的方式:在XML中声明UI布局和在代码中创建布局.这两种方式创建出的布局没有本质差别,为了熟悉两种方式,我们将通过XML的方式编写第一个页面,

  • Java持久层框架Mybatis入门详细教程

    mybatis介绍 mybatis它是轻量级持久层框架,由ibatis演化而来.它自动连接数据库,将数据库的结果集封装到对象中POJO. POJO: 一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象.在理想情况下,POJO不应该有注解. JavaBean: JavaBean是可序列化的,实现了serializable接口 具有一个无参构造器 有按照命名规范的set和gett,is(可以用于访问布尔类型的属性)方法 My

  • MyBatis入门介绍(超简单)

    MyBatis 简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects

  • Spring的异常重试框架Spring Retry简单配置操作

    相关api见:点击进入 /* * Copyright 2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *

  • Java Dubbo框架知识点梳理

    1.Dubbo是什么 Dubbo 是一个分布式.高性能.透明化的 RPC 服务框架,提供服务自动注册.自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成. RPC 指的是远程调用协议,也就是说两个服务器交互数据. 2.Dubbo的由来 互联网的快速发展,Web应用程序的规模不断扩大,一般会经历如下四个发展阶段. 单一应用架构:当网站流量很小时,只需一个应用,将所有功能都部署在一起即可. 垂直应用架构:当访问量逐渐增大,单一应用按照有业务线拆成多个应用,以提升效率.此时,用于加速前端

随机推荐