工具类:
import org.springframework.retry.RecoveryCallback; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryPolicy; import org.springframework.retry.backoff.BackOffPolicy; import org.springframework.retry.backoff.FixedBackOffPolicy; import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.support.RetryTemplate; import com.google.common.base.Preconditions; /** * @ClassName: RetryUtils * @author kanpiaoxue * @version 1.0 * @CreateTime: 2019/02/01 15:54:15 * @Description: 重试工具类 */ public class RetryUtils { /** * 创建重试模板 * * @param retryPolicy * 重试策略 * @param backOffPolicy * 延迟策略 * @return 重试模板 * @author kanpiaoxue * @CreateTime: 2019/02/01 16:23:00 */ public static RetryTemplate createRetryTemplate(RetryPolicy retryPolicy, BackOffPolicy backOffPolicy) { Preconditions.checkNotNull(retryPolicy, "retryPolicy is null"); Preconditions.checkNotNull(backOffPolicy, "backOffPolicy is null"); RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(retryPolicy); template.setBackOffPolicy(backOffPolicy); return template; } /** * 创建重试模板 * * @param maxAttempts * 最大尝试次数 * @param backOffPeriod * 延迟毫秒数 * @return 重试模板 * @author kanpiaoxue * @CreateTime: 2019/02/01 16:23:48 */ public static RetryTemplate createSimpleRetryTemplate(int maxAttempts, long backOffPeriod) { Preconditions.checkArgument(maxAttempts >= 1, "maxAttempts must be greate than 1"); Preconditions.checkArgument(backOffPeriod >= 1, "backOffPeriod must be greate than 1"); // 重试策略 SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(maxAttempts); // 设置间隔策略 FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); backOffPolicy.setBackOffPeriod(backOffPeriod); // 初始化重试模板 RetryTemplate template = createRetryTemplate(retryPolicy, backOffPolicy); return template; } /** * 使用重试策略执行方法 * * @param maxAttempts * 最大尝试次数 * @param backOffPeriod * 延迟毫秒数 * @param retryCallback * 重试的方法回调函数 * @return 正常执行方法的返回值 * @throws E * @author kanpiaoxue * @CreateTime: 2019/02/01 16:24:25 */ public static <T, E extends Throwable> T execute(int maxAttempts, long backOffPeriod, RetryCallback<T, E> retryCallback) throws E { Preconditions.checkNotNull(retryCallback, "retryCallback is null"); RetryTemplate template = createSimpleRetryTemplate(maxAttempts, backOffPeriod); return template.execute(retryCallback); } /** * * 使用重试策略执行方法 * * @param maxAttempts * 最大尝试次数 * @param backOffPeriod * 延迟毫秒数 * @param retryCallback * 重试的方法回调函数 * @param recoveryCallback * 重试失败之后覆盖回调函数 * @return 正常执行方法的返回值 * @throws E * @author kanpiaoxue * @CreateTime: 2019/02/01 16:25:41 */ public static <T, E extends Throwable> T execute(int maxAttempts, long backOffPeriod, RetryCallback<T, E> retryCallback, RecoveryCallback<T> recoveryCallback) throws E { Preconditions.checkNotNull(retryCallback, "retryCallback is null"); Preconditions.checkNotNull(recoveryCallback, "recoveryCallback is null"); RetryTemplate template = createSimpleRetryTemplate(maxAttempts, backOffPeriod); return template.execute(retryCallback, recoveryCallback); } /** * 私有化构造函数,防止被初始化 */ private RetryUtils() { super(); } }
示例代码:
import org.kanpiaoxue.springExample.retry.utils.RetryUtils; import org.springframework.retry.backoff.FixedBackOffPolicy; import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.support.RetryTemplate; import java.util.concurrent.atomic.AtomicInteger; /** * @ClassName: RetryExample * @author kanpiaoxue * @version 1.0 * @CreateTime: 2019/02/01 14:59:30 */ public class RetryExample { /** * * @param args * @author kanpiaoxue * @throws Exception * @CreateTime: 2019/02/01 14:59:31 */ public static void main(String[] args) throws Exception { retry0(); retry1(); retry2(); retry3(); } public static void retry3() { AtomicInteger count = new AtomicInteger(); String result = RetryUtils.execute(5, 3000L, context -> { System.out.println("TestAll.main() " + count.incrementAndGet()); throw new IllegalArgumentException(); }); System.out.println("result:" + result); } public static void retry2() { // 初始化重试模板 RetryTemplate template = RetryUtils.createSimpleRetryTemplate(5, 3000L); AtomicInteger count = new AtomicInteger(); String result = template.execute(context -> { System.out.println("TestAll.main() " + count.incrementAndGet()); throw new IllegalArgumentException(); }); System.out.println("result:" + result); } public static void retry1() { // 重试策略 SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(5); // 设置间隔策略 FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); backOffPolicy.setBackOffPeriod(1000L); // 初始化重试模板 RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(retryPolicy); template.setBackOffPolicy(backOffPolicy); AtomicInteger count = new AtomicInteger(); String result = template.execute(context -> { System.out.println("TestAll.main() " + count.incrementAndGet()); throw new IllegalArgumentException(); }, context -> { System.out.println("TestAll.main() recover"); return "world"; }); System.out.println("result:" + result); } public static void retry0() { AtomicInteger count = new AtomicInteger(); String result = RetryUtils.execute(5, 3000L, context -> { System.out.println("TestAll.main() " + count.incrementAndGet()); throw new IllegalArgumentException(); }, context -> { System.out.println("TestAll.main() recover"); return "world"; }); System.out.println("result:" + result); } }
相关推荐
Spring Retry 为开发者提供了一套强大的工具,使得在 Spring Boot 应用中实现重试逻辑变得简单。结合适当的配置和业务逻辑,我们可以有效地处理网络抖动、服务不稳定等问题,提升系统的整体性能。
在Java开发中,特别是在分布式系统、网络调用或数据库操作等可能出现临时性错误的情景下,Spring Retry是一个非常实用的工具。 在Spring Retry项目中,主要涉及以下几个核心概念和功能: 1. **RetryTemplate**: 这...
这个库包含了Spring AMQP项目的核心功能,如连接工厂、模板类、监听容器等,使得开发者能够方便地在Spring应用中发送和接收消息。 2. **spring-amqp-1.5.1.RELEASE.jar**:这是Spring AMQP项目的主要库,它提供了...
5. **熔断和重试(Circuit Breaker & Retry)**:借助Spring的Hystrix或Resilience4J,Starter可以实现gRPC客户端的熔断和重试策略,增强系统的健壮性。 6. **监控和日志(Monitoring & Logging)**:gRPC-Spring-...
在`spring-amqp`中,你可以使用`RabbitTemplate`作为主要的工具类,它封装了发送和接收消息的方法,支持各种消息模式,如简单、Direct、Topic、Fanout等。此外,`AmqpAdmin`接口提供了声明交换机、队列和绑定的功能...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
Spring AMQP 提供了许多高级特性,如 DLQ(Dead Letter Queue)、TTL(Time To Live)、Retry Policy 和 Confirm/CNACK 机制等,可以根据实际需求进行配置和使用。 通过以上步骤,你就成功地在 Spring Boot 项目中...
本文将详细探讨Spring AMQP的原理、使用方法以及实战技巧,帮助读者全面掌握这一强大的工具。 首先,我们需要了解什么是Spring AMQP。Spring AMQP是Spring框架的一个模块,它提供了与Advanced Message Queuing ...
- 需要定义服务接口及其实现类,并使用`@EnableDiscoveryClient`注解使Spring Cloud能够自动注册服务到Consul。 - **服务消费者** (`consul-test-client`): - 可以通过`RestTemplate`或者`Feign`来实现对服务提供...
- **commons通用项目**:包含公共组件、工具类等。 - **Itemservice商品服务**:处理商品相关的逻辑。 - **Userservice用户服务**:处理用户相关的逻辑。 - **Orderservice订单服务**:处理订单相关的逻辑。 ##...
对于IE浏览器,可以通过使用`event-source-polyfill`这类工具来实现对SSE的支持。不同版本浏览器的具体支持情况可通过访问[caniuse.com](https://caniuse.com/?search=server-sent%20events)进行查询。 #### SSE...
- 在服务提供者的Spring配置文件(如`beans.xml`)中,使用`<dubbo:service>`标签定义服务,指定接口、实现类以及其它属性,如版本、协议、分组等。 5. **注册中心配置** - Dubbo支持多种注册中心,如Zookeeper、...
Dubbox,作为一款基于Spring的RPC框架,由当当网开源,是Java开发者们在构建分布式系统时常常选用的工具。它不仅集成了Apache的Dubbo,还包含了更多的扩展功能,如RESTful支持、Hessian2协议等。本文将深入探讨...
- **区别:**全自动ORM工具更适合于简单模型的快速开发,而MyBatis更适合于复杂查询的需求。 **19. 一对一、一对多的关联查询?** - **一对一关联:**使用`<association>`标签进行一对一关联映射。 - **一对多关联...
1. **源代码**:项目的核心代码,通常位于`src/main/java`目录下,包含了服务提供者和服务消费者的实现,以及可能的配置和工具类。 2. **配置文件**:Dubbo的配置通常在`src/main/resources`目录下的XML文件中,如`...
除了基本的RPC调用,Dubbo还提供了丰富的特性,如集群容错策略(Failover、Failfast、Failsafe、Fallback、Retry等),服务路由(根据不同的条件选择不同的服务实例进行调用),负载均衡(Random、RoundRobin、...