`
raymond.chen
  • 浏览: 1436848 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring retry框架的使用

 
阅读更多

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的使用

    本文将深入探讨两个常用的重试框架:Spring Retry和Guava Retry,并通过一个名为`retry-starter`的Spring Boot项目实例,来解析它们的使用方式以及差异。 首先,我们来看Spring Retry。Spring Retry是Spring框架的...

    spring-retry,.zip

    Spring Retry项目是Spring框架的一个扩展,它的主要目标是简化应用程序中对重试逻辑的实现。通过使用该库,开发者可以轻松地在遇到预期之外的异常时自动重试操作,而无需编写复杂的错误处理代码。这种声明式的重试...

    Spring Retry 和 Guava Retrying重试机制的使用详解

    Spring Retry是Spring框架的一部分,它提供了一种声明式的重试机制。通过简单的注解,如`@Retryable`,可以在方法级别定义重试逻辑。这个注解允许开发者指定重试次数、间隔时间、异常类型等参数。例如,如果一个网络...

    spring-amqp,spring-retry,spring-rabbit

    标题中的"spring-amqp"、"spring-retry"和"spring-rabbit"是Spring框架的三个关键组件,它们主要用于构建高效、可靠的分布式系统,尤其是在消息传递和错误处理方面。 1. **Spring AMQP**: Spring AMQP是Spring框架...

    spring-retry:使用spring-retry项目的例子

    Spring重试是Spring框架的一个扩展模块,主要用于处理应用程序中的异常情况,通过自动重试机制提高系统的容错性和稳定性。在Java开发中,特别是在分布式系统、网络调用或数据库操作等可能出现临时性错误的情景下,...

    详解重试框架Spring retry实践

    Spring Retry 是一个强大的重试和熔断框架,它源自 Spring Batch 项目,专门用于处理可能出现异常的场景,尤其是针对远程调用和网络不稳定的情况。在微服务架构中,重试和熔断机制是非常重要的,它们有助于提高系统...

    spring-retry简单使用方法

    Spring Retry 是 Spring 框架中的一种 retry 机制,主要用于解决分布式系统中数据一致性的问题。它可以在 RPC 调用或发送 MQ 消息时,自动重试失败的操作,以确保数据的一致性。 添加 Maven 依赖 在使用 Spring ...

    retry-demo.rar

    Spring Retry框架就是为了应对这类问题而设计的,它提供了一种优雅的方式来处理可能出现的异常情况,比如网络延迟、临时服务中断等。本项目"retry-demo.rar"是一个基于Spring Retry的工程示例,用于演示如何在调用...

    smart-retry:Smart Retry主要是用来进行任务重试的。和Guava Retry、Spring Retry相比,Smart Retry最大的特点是异步重试,支持持久化,系统重启之后可以继续重试

    市面上开源的重试框架有很多,如Guava Retry、Spring Retry等都支持重试,但是他们都不支持任务的持久化,系统更新重启,重试任务就会丢失,这无法保证数据的一致性。传统的做法是写一个定时任务,定时补偿。但这样...

    Spring-retry 1.1.4重试功能.rar

    本文将详细阐述Spring-retry 1.1.4的重试功能及其核心概念、配置和使用方法。 一、核心概念 1. **RetryTemplate**:这是Spring-retry的核心类,用于定义和执行重试逻辑。通过这个模板,我们可以设置重试策略、回退...

    spring整合rabbitmq需要的jar包(spring版本4.2.0)

    在IT行业中,Spring框架是Java应用开发中的一个关键组件,它提供了一整套服务来简化企业级应用的构建。RabbitMQ则是一个流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,用于高效地...

    springbatch 详解PDF附加 全书源码 压缩包

    Spring Batch 是一个强大的、全面的批处理框架,由 Spring 社区开发,旨在简化企业级应用中的批量数据处理任务。这个框架提供了一种标准的方式来处理大量的数据输入和输出,使得开发者能够专注于业务逻辑,而不是...

    [] - 2022-12-21 消息重试框架 Spring-Retry 和 Guava-Retry,这个框架有点意思.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    基于Java的Spring Boot项目开发指南.zip

    2. SpringRetry实现重试机制,常与RestTemplate配合使用。 3. Elasticsearch实现分布式搜索和分析引擎功能。 4. OAuth2实现OAuth2认证机制。 5. Stream学习JDK8的Stream用法。 6. CAS实现CAS单点登录服务端和客户端...

    [] - 2022-08-24 重试框架 Spring-Retry 和 Guava-Retry,你知道该怎么选吗?.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能

    Spring Batch in Action英文pdf版

    Spring Batch是一个开源的轻量级、全面的批处理框架,它是为了解决企业应用中的大规模数据处理需求而设计的。Spring Batch in Action是一本专注于Spring Batch框架的书籍,由Arnaud Cogoluègnes、Thierry Templier...

    spring-batch-reference.pdf

    SpringBatch是一个轻量级、全面的批处理框架,它是Spring框架的一部分,专注于提供企业级的批处理能力。SpringBatch的核心理念是提供一个可扩展的架构,支持处理大量数据时的性能和复杂性,无论数据来自何种数据源。...

    spring batch指南

    《Spring Batch指南》深入浅出地介绍了如何利用Spring Batch这一强大的框架进行大数据批处理。Spring Batch是Spring生态体系中的一个核心组件,专为处理大量数据而设计,它提供了丰富的功能和高度可配置性,适用于...

    详细spring batch资料

    Spring Batch 是一个强大的Java框架,专门用于处理批量处理任务。它是Spring生态系统的组成部分,提供了大量功能,如事务管理、错误处理、作业跟踪和监控。在本文中,我们将深入探讨Spring Batch的基本概念、核心...

Global site tag (gtag.js) - Google Analytics