更好的 java 重试框架 sisyphus 的 3 种使用方式
回顾
我们前面学习了
更好的 java 重试框架 sisyphus 入门简介
更好的 java 重试框架 sisyphus 配置的 2 种方式介绍
更好的 java 重试框架 sisyphus 背后的故事
java 重试框架 sisyphus 开源地址
这一节让我们一起学习下 sisyphus 的 3 种使用方式。
sisyphus 代理模板
目的
为了便于用户更加方便地使用注解,同时又不依赖 spring。
提供基于代码模式+字节码增强实现的方式。
使用案例
maven 引入
引入注解相关模块。
<dependency><groupId>com.github.houbb</groupId><artifactId>sisyphus-annotation</artifactId><version>0.0.9</version>
</dependency>
定义测试方法
以下测试代码可以参考 spring-test 模块。
- MenuServiceImpl.java
public class MenuServiceImpl {public void queryMenu(long id) {System.out.println("查询菜单...");throw new RuntimeException();}@Retrypublic void queryMenuRetry(long id) {System.out.println("查询菜单...");throw new RuntimeException();}}
测试
使用 RetryTemplate 进行测试
无重试注解的方法
@Test(expected = RuntimeException.class)
public void templateTest() {MenuServiceImpl menuService = RetryTemplate.getProxyObject(new MenuServiceImpl());menuService.queryMenu(1);
}
- 日志信息
查询菜单...
只请求了一次。
有注解的方法
@Test(expected = RuntimeException.class)
public void templateRetryTest() {MenuServiceImpl menuService = RetryTemplate.getProxyObject(new MenuServiceImpl());menuService.queryMenuRetry(1);
}
- 日志信息
查询菜单...
查询菜单...
查询菜单...
sisyphus spring 整合
目的
类似于 spring-retry 框架,如果你使用 spring 框架,那么整合本项目将会非常简单。
注解的方式和过程式编程,二者尽可能的保持一致性,你想从一种方式变为另一种也比较简单。
想从 spring-retry 切换到本框架也很方便。
maven 引入
<dependency><groupId>${project.groupId}</groupId><artifactId>sisyphus-spring</artifactId><version>${project.version}</version>
</dependency>
会默认引入 spring 以及 AOP 相关 jar。
业务代码
你可以参考 sisyphus-test 模块。
下面模拟非常常见的一些业务方法。
使用 @Retry
标识方法需要进行重试。
- SpringService.java
public interface SpringService {/*** 查询示例代码* @return 结果*/String query();}
- SpringServiceImpl.java
import com.github.houbb.sisyphus.annotation.annotation.Retry;
import com.github.houbb.sisyphus.test.service.SpringService;
import org.springframework.stereotype.Service;/*** @author binbin.hou* @since 0.0.4*/
@Service
public class SpringServiceImpl implements SpringService {@Override@Retrypublic String query() {System.out.println("spring service query...");throw new RuntimeException();}}
开启重试
基于注解直接如下配置即可。
使用 @EnableRetry
标识需要开启重试。
@Configurable
@ComponentScan(basePackages = "com.github.houbb.sisyphus.test.service")
@EnableRetry
public class SpringConfig {}
测试代码
import com.github.houbb.sisyphus.test.config.SpringConfig;
import com.github.houbb.sisyphus.test.service.SpringService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** @author binbin.hou* @since 0.0.4*/
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringServiceTest {@Autowiredprivate SpringService springService;@Test(expected = RuntimeException.class)public void queryTest() {springService.query();}}
- 日志信息
spring service query...
spring service query...
spring service query...
sisyphus springboot 整合
目的
类似于 spring-retry 框架,如果你使用 springboot 框架,那么整合本项目将会非常简单。
注解的方式和过程式编程,二者尽可能的保持一致性,你想从一种方式变为另一种也比较简单。
想从 spring-retry 切换到本框架也很方便。
整体与 spring 整合类似,而且更加简单。
maven 引入
<dependency><groupId>${project.groupId}</groupId><artifactId>sisyphus-springboot-starter</artifactId><version>${project.version}</version>
</dependency>
会默认引入 springboot 整合相关的依赖。
业务代码
你可以参考 sisyphus-test springboot 测试模块。
下面模拟非常常见的一些业务方法。
使用 @Retry
标识方法需要进行重试。
- SpringService.java
public interface SpringService {/*** 查询示例代码* @return 结果*/String query();}
- SpringServiceImpl.java
import com.github.houbb.sisyphus.annotation.annotation.Retry;
import com.github.houbb.sisyphus.test.service.SpringService;
import org.springframework.stereotype.Service;/*** @author binbin.hou* @since 0.0.4*/
@Service
public class SpringServiceImpl implements SpringService {@Override@Retrypublic String query() {System.out.println("spring service query...");throw new RuntimeException();}}
测试代码
- SisyphusApplicationTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SisyphusApplication.class)
public class SisyphusApplicationTest {@Autowiredprivate SpringService springService;@Test(expected = RuntimeException.class)public void queryTest() {springService.query();}}
其中 SisyphusApplication.java 代码如下:
就是最基本的 springboot 启动入口。
@SpringBootApplication
@ComponentScan(basePackages = "com.github.houbb.sisyphus.test.service")
public class SisyphusApplication {public static void main(String[] args) {SpringApplication.run(SisyphusApplication.class, args);}}
- 日志信息
spring service query...
spring service query...
spring service query...
小结
3 种使用方式基本可以满足日常开发中的各种场景。
java 重试框架 sisyphus 开源地址
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次重逢。
更好的 java 重试框架 sisyphus 的 3 种使用方式相关推荐
- spring框架xml的几种配置方式
spring框架xml的几种配置方式 ioc配置一般由一下两大类 1 手动装配 利用xml手动配置,分为:setter方法装配 ,构造器装配 2 自动装配 利用注解自动装配 准备工作:userdao ...
- Java中List集合的三种遍历方式(全网最详)
Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...
- java线程的任务的三种创建方式,严格地说,就一种,就是如何重写Runnable接口的run()方法
仅简单演示Java中线程任务的三种创建方式 第一种:使用了适配器模式,有返回值,能抛出异常,任务代码写在Callable.call()方法中,Runnable的run方法会通过适配器调用到Callab ...
- java foreach hashmap_在 Java 中遍历 HashMap 的5种最佳方式
在本文中,我们将通过示例讨论在 Java 上遍历 HashMap 的五种最佳方式. 使用 Iterator 遍历 HashMap EntrySet 使用 Iterator 遍历 HashM ...
- Java本地高性能缓存的几种实现方式
Java缓存技术可分为远端缓存和本地缓存,远端缓存常用的方案有著名的redis和memcache,而本地缓存的代表技术主要有HashMap,Guava Cache,Caffeine和Encahche. ...
- java中字符串的创建_【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- java servlet接口开发_servlet三种实现方式之一实现servlet接口
servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第一种示例代码如下(已去掉包名): import ...
- java中List集合的几种遍历方式
本文中我们给出了List集合中的四种遍历方式,分别是for循环,迭代器循环,代码及相应的注释如下: package d1_collection;import java.util.*;public cl ...
- Java中匿名类的两种实现方式
使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...
- 四:Java+SpringBoot框架使用(两种携带参数的get接口开发)
get请求携带参数一般有两种方式:第一种是url?key1=value1&key2=value2,第二种是url/value1/value2,所以两种方式分开来讲 1.url?key1=val ...
最新文章
- 如何进行软件测试需求分析
- uwsgi xml 配置
- windows内存结构概述
- 云专网和云专线的区别_传统IDC行业与云计算的区别?
- Spring Boot Serverless 实战系列“架构篇” 首发 | 光速入门函数计算
- php生成 优惠券 激活码
- BZOJ 1041 圆上的整点 数学
- hdu 1811 Rank of Tetris 并查集+拓扑排序
- 计算机理工 教学计划,教学计划格式-华南理工大学计算机科学与工程学院.DOC
- java linq select_Java 8是否还需要LINQ?还是已经比LINQ 更好?
- js判断是否是数组的几种方法
- hbase数据库scan操作_HBase Scan 使用
- 读书笔记---Naive Bayes
- 【TypeScript】JSX 元素隐式具有类型 “any“,因为不存在接口 “JSX.IntrinsicElements“。ts(7026)
- 一个HashMap对象所占内存的分析
- 偏度与峰度(附python代码)
- 服务异步通信RabbitMQ
- 高级软件工程第九次作业:东理三剑客团队作业-随笔6
- Android端手机测试体系
- Java反射获取构造方法