spring retry是从spring batch独立出来的一个功能,主要实现了重试和熔断。
重试策略:
NeverRetryPolicy:只调用RetryCallback一次,不重试
SimpleRetryPolicy:重试n次,默认3次,也是RetryTemplate模板默认的策略。很常用
ExceptionClassifierRetryPolicy:可以根据不同的异常,执行不同的重试策略,很常用
TimeoutRetryPolicy:在n毫秒内不断进行重试,超过这个时间后停止重试
CircuitBreakerRetryPolicy:熔断功能的重试
CompositeRetryPolicy:将不同的策略组合起来,有悲观组合和乐观组合。悲观默认重试,有不重试的策略则不重试。乐观默认不重试,有需要重试的策略则重试
AlwaysRetryPolicy:无限重试,最好不要用
退避策略:每次重试是立即重试还是等待一段时间后重试
NoBackOffPolicy:不回避
FixedBackOffPolicy:n毫秒退避后再进行重试,需设置参数sleeper和backOffPeriod,sleeper指定等待策略,默认是Thread.sleep,即线程休眠,backOffPeriod指定休眠时间,默认1秒
UniformRandomBackOffPolicy:随机选择一个[n,m](如20ms,40ms)回避时间回避后,然后再重试,需设置sleeper、minBackOffPeriod和maxBackOffPeriod,该策略在[minBackOffPeriod,maxBackOffPeriod之间取一个随机休眠时间,minBackOffPeriod默认500毫秒,maxBackOffPeriod默认1500毫秒
ExponentialBackOffPolicy:指数退避策略,需设置参数sleeper、initialInterval、maxInterval和multiplier,initialInterval指定初始休眠时间,默认100毫秒,maxInterval指定最大休眠时间,默认30秒,multiplier指定乘数,即下一次休眠时间为当前休眠时间*multiplier
ExponentialRandomBackOffPolicy:随机指数退避策略,引入随机乘数可以实现随机乘数回退
无状态重试是指重试在一个线程上下文中完成的重试,反之不在一个线程上下文完成重试的就是有状态重试。需要有状态重试的情况通常有两种:事务回滚和熔断。
主要的依赖包:
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.1</version> </dependency>
范例:
public void retry1() throws Exception { RetryTemplate retryTemplate = new RetryTemplate(); //重试策略 SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(3); //最多重试3次 // TimeoutRetryPolicy retryPolicy = new TimeoutRetryPolicy(); // retryPolicy.setTimeout(5000L); //超时重试:在指定时间内可以不断重试 //退避策略 FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); fixedBackOffPolicy.setBackOffPeriod(500); //间隔1000毫秒 retryTemplate.setRetryPolicy(retryPolicy); retryTemplate.setBackOffPolicy(fixedBackOffPolicy); //重试操作 final RetryCallback<Boolean, Exception> retryCallback = new RetryCallback<Boolean, Exception>() { @Override public Boolean doWithRetry(RetryContext retryContext) throws Exception { System.out.println(String.format("retry count: %s", retryContext.getRetryCount()+1)); throwError(retryContext.getRetryCount()+1); return true; } }; //重试失败后执行兜底回调 final RecoveryCallback<Boolean> recoveryCallback = new RecoveryCallback<Boolean>() { @Override public Boolean recover(RetryContext retryContext) throws Exception { System.out.println(String.format("after retry: %s, recovery method called!", retryContext.getRetryCount()+1)); return false; } }; Boolean result = retryTemplate.execute(retryCallback, recoveryCallback); System.out.println(String.format("execute result: %s", result)); } private void throwError(int retryCount) throws Exception { if(retryCount < 20){ throw new Exception(""); } }
在Springboot环境下使用spring retry:
主要注解类:
@EnableRetry:启用重试机制,proxyTargetClass属性为true时(默认false)使用CGLIB代理
@Retryable:在需要被重试的方法上加上该注解类
maxAttempts 最大重试次数。默认3次
vaue 指定要重试的异常。默认为空
backoff 重试等待策略。默认使用@Backoff注解
include 指定处理的异常类。默认为空
exclude 指定不需要处理的异常。默认为空
@Backoff:重试回退策略(立即重试还是等待一会再重试)
delay 延迟重试的毫秒数
multiplier 延迟间隔时间的倍数
不设置参数时,默认使用FixedBackOffPolicy,重试等待1000ms
只设置delay()属性时,使用FixedBackOffPolicy,重试等待指定的毫秒数
当设置delay()和maxDealy()属性时,重试等待在这两个值之间均态分布
使用delay(),maxDealy()和multiplier()属性时,使用ExponentialBackOffPolicy
当设置multiplier()属性不等于0时,同时也设置了random()属性时,使用ExponentialRandomBackOffPolicy
@Recover: 用于方法。
用于@Retryable失败时的“兜底”处理方法
@CircuitBreaker:用于方法,实现熔断模式。
include 指定处理的异常类。默认为空
exclude指定不需要处理的异常。默认为空
vaue指定要重试的异常。默认为空
maxAttempts 最大重试次数。默认3次
openTimeout 配置熔断器打开的超时时间,默认5s,当超过openTimeout之后熔断器电路变成半打开状态(只要有一次重试成功,则闭合电路)
resetTimeout 配置熔断器重新闭合的超时时间,默认20s,超过这个时间断路器关闭
定义服务类:
/** * 使用了@Retryable的方法不能在本类被调用,不然重试机制不会生效 * @Retryable 跟 @Recover 标注的方法,返回值必须相同。 * 使用了@Retryable的方法里面不能使用try...catch包裹,要在方法上抛出异常,不然不会触发 */ @Service public class RemoteService { /** * 调用该方法过程中发生RemoteAccessException异常时触发重试机制,重试次数达到指定值后,触发@Recover标注的方法 */ @Retryable(value=RemoteAccessException.class, maxAttempts=3, backoff=@Backoff(delay=500, multiplier=1.5)) public void call() throws Exception { throw new RemoteAccessException("invoke RemoteService.call() error"); } /** * 退避方法 */ @Recover public void recover(RemoteAccessException ex) { System.out.println(ex.toString()); } /** * Exception异常没有对应的退避方法 */ @Retryable(value=Exception.class, maxAttempts=3) public boolean pay(int num) throws Exception { System.out.println(LocalDateTime.now().toString()); if(num < 0){ throw new Exception("num must be greater than 0"); } return true; } }
在启动类引用服务类进行测试:
@SpringBootApplication() @RestController @EnableRetry //启用重试机制 public class Main{ @Autowired private RemoteService remoteService; public static void main(String[] args){ SpringApplication.run(Main.class, args); } @GetMapping("/index") public String index(){ try { remoteService.call(); remoteService.pay(-1); } catch (Exception ex) { System.out.println(ex.toString()); } return LocalDateTime.now().toString(); } }
相关推荐
本文将深入探讨两个常用的重试框架:Spring Retry和Guava Retry,并通过一个名为`retry-starter`的Spring Boot项目实例,来解析它们的使用方式以及差异。 首先,我们来看Spring Retry。Spring Retry是Spring框架的...
Spring Retry项目是Spring框架的一个扩展,它的主要目标是简化应用程序中对重试逻辑的实现。通过使用该库,开发者可以轻松地在遇到预期之外的异常时自动重试操作,而无需编写复杂的错误处理代码。这种声明式的重试...
Spring Retry是Spring框架的一部分,它提供了一种声明式的重试机制。通过简单的注解,如`@Retryable`,可以在方法级别定义重试逻辑。这个注解允许开发者指定重试次数、间隔时间、异常类型等参数。例如,如果一个网络...
标题中的"spring-amqp"、"spring-retry"和"spring-rabbit"是Spring框架的三个关键组件,它们主要用于构建高效、可靠的分布式系统,尤其是在消息传递和错误处理方面。 1. **Spring AMQP**: Spring AMQP是Spring框架...
Spring重试是Spring框架的一个扩展模块,主要用于处理应用程序中的异常情况,通过自动重试机制提高系统的容错性和稳定性。在Java开发中,特别是在分布式系统、网络调用或数据库操作等可能出现临时性错误的情景下,...
Spring Retry 是一个强大的重试和熔断框架,它源自 Spring Batch 项目,专门用于处理可能出现异常的场景,尤其是针对远程调用和网络不稳定的情况。在微服务架构中,重试和熔断机制是非常重要的,它们有助于提高系统...
Spring Retry 是 Spring 框架中的一种 retry 机制,主要用于解决分布式系统中数据一致性的问题。它可以在 RPC 调用或发送 MQ 消息时,自动重试失败的操作,以确保数据的一致性。 添加 Maven 依赖 在使用 Spring ...
Spring Retry框架就是为了应对这类问题而设计的,它提供了一种优雅的方式来处理可能出现的异常情况,比如网络延迟、临时服务中断等。本项目"retry-demo.rar"是一个基于Spring Retry的工程示例,用于演示如何在调用...
市面上开源的重试框架有很多,如Guava Retry、Spring Retry等都支持重试,但是他们都不支持任务的持久化,系统更新重启,重试任务就会丢失,这无法保证数据的一致性。传统的做法是写一个定时任务,定时补偿。但这样...
本文将详细阐述Spring-retry 1.1.4的重试功能及其核心概念、配置和使用方法。 一、核心概念 1. **RetryTemplate**:这是Spring-retry的核心类,用于定义和执行重试逻辑。通过这个模板,我们可以设置重试策略、回退...
在IT行业中,Spring框架是Java应用开发中的一个关键组件,它提供了一整套服务来简化企业级应用的构建。RabbitMQ则是一个流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,用于高效地...
Spring Batch 是一个强大的、全面的批处理框架,由 Spring 社区开发,旨在简化企业级应用中的批量数据处理任务。这个框架提供了一种标准的方式来处理大量的数据输入和输出,使得开发者能够专注于业务逻辑,而不是...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
2. SpringRetry实现重试机制,常与RestTemplate配合使用。 3. Elasticsearch实现分布式搜索和分析引擎功能。 4. OAuth2实现OAuth2认证机制。 5. Stream学习JDK8的Stream用法。 6. CAS实现CAS单点登录服务端和客户端...
互联网资讯,技术简介,IT、AI技术,人工智能
Spring Batch是一个开源的轻量级、全面的批处理框架,它是为了解决企业应用中的大规模数据处理需求而设计的。Spring Batch in Action是一本专注于Spring Batch框架的书籍,由Arnaud Cogoluègnes、Thierry Templier...
SpringBatch是一个轻量级、全面的批处理框架,它是Spring框架的一部分,专注于提供企业级的批处理能力。SpringBatch的核心理念是提供一个可扩展的架构,支持处理大量数据时的性能和复杂性,无论数据来自何种数据源。...
《Spring Batch指南》深入浅出地介绍了如何利用Spring Batch这一强大的框架进行大数据批处理。Spring Batch是Spring生态体系中的一个核心组件,专为处理大量数据而设计,它提供了丰富的功能和高度可配置性,适用于...
Spring Batch 是一个强大的Java框架,专门用于处理批量处理任务。它是Spring生态系统的组成部分,提供了大量功能,如事务管理、错误处理、作业跟踪和监控。在本文中,我们将深入探讨Spring Batch的基本概念、核心...