背景介绍
在实际工作过程中,重试是一个经常使用的手段。比如MQ
发送消息失败,会采取重试手段,比如工程中使用RPC
请求外部服务,可能因为网络
波动出现超时而采取重试手段......可以看见重试操作是非常常见的一种处理问题,系统设计的手段
而在之前我们项目中处理重拾操作依赖MQ自身的重试机制,但是这种机制不是很灵活,如果某些功能没有使用MQ的话,那么就不是那么方便了,而本文介绍的Spring-Retry
却能够以一种很优雅的方式解决这种问题,当然目前版本的Spring-retry还不是完美的,还是有待改进的.不过已经很不错了.
基本使用
-
例子1
@Configuration @EnableRetry public class Application { @Bean public Service service() { return new Service(); } } @Service class Service { @Retryable(RemoteAccessException.class) public void service() { // ... do something } @Recover public void recover(RemoteAccessException e) { // ... panic } }
-
例子2
@org.springframework.stereotype.Service public class Service1 { @Retryable(value = {RemoteAccessException.class, RuntimeException.class}, maxAttempts = 2, backoff = @Backoff(value = 2000)) public void service() { System.out.println("do some things"); // this exception will just trigger recover1, do not trigger recover3 throw new RemoteAccessException("remote access exception"); // this exception will just trigger recover2 // throw new RuntimeException("runtime exception"); // System.out.println("do another things"); } // 如果使用注解的话,这个recover貌似只能写在本类中,我测试了如果将recover方法写在 // recoverService中,好像找不到 @Recover public void recover1(RemoteAccessException e) { System.out.println(e.getMessage()); System.out.println("do recover operation1"); } @Recover public void recover2(RuntimeException e) { System.out.println(e.getMessage()); System.out.println("do recover operation2"); } @Recover public void recover3(RemoteAccessException e) { System.out.println(e.getMessage()); System.out.println("do recover operation3"); } }
-
例子3
@Service public class Service2 { public void test(){ final RetryTemplate retryTemplate = new RetryTemplate(); final SimpleRetryPolicy policy = new SimpleRetryPolicy(3, Collections.<Class<? extends Throwable>, Boolean> singletonMap(Exception.class, true)); FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); fixedBackOffPolicy.setBackOffPeriod(100); retryTemplate.setRetryPolicy(policy); retryTemplate.setBackOffPolicy(fixedBackOffPolicy); final RetryCallback<Object, Exception> retryCallback = new RetryCallback<Object, Exception>() { public Object doWithRetry(RetryContext context) throws Exception { System.out.println("do some thing"); //设置context一些属性,给RecoveryCallback传递一些属性 context.setAttribute("key1", "value1"); System.out.println(context.getRetryCount()); throw new Exception("exception"); // return null; } }; // 如果RetryCallback执行出现指定异常, 并且超过最大重试次数依旧出现指定异常的话,就执行RecoveryCallback动作 final RecoveryCallback<Object> recoveryCallback = new RecoveryCallback<Object>() { public Object recover(RetryContext context) throws Exception { System.out.println("do recory operation"); System.out.println(context.getAttribute("key1")); return null; } }; try { final Object execute = retryTemplate.execute(retryCallback, recoveryCallback); } catch (Exception e) { e.printStackTrace(); } } }
参考资料
http://www.cnblogs.com/rollenholt/p/4711441.html
相关推荐
Spring-Retry更适合已经使用Spring框架的项目,因为它提供了声明式重试,集成简单,但在定制性上可能略逊于Guava Retrying。而Guava Retrying则适用于对重试逻辑有高度定制需求的场景,但可能需要更多的编码工作。 ...
默认情况下,Spring Retry 会记录基本信息到日志。 ```java @Bean public RetryListener myRetryListener() { return new RetryListenerSupport() { @Override public , E extends Throwable> boolean open...
1. **数据迁移**: 使用 Spring Batch 实现大规模数据迁移,例如从旧数据库到新数据库的转换。 2. **报告生成**: 处理大量数据生成报表,如日志分析、财务报告等。 3. **定时任务**: 结合 Quartz 或者 Spring ...
在本文中,我们将深入探讨Spring Batch的基本概念、核心组件以及如何在实际项目中应用它。 1. **基本概念** - **作业(Job)**:在Spring Batch中,作业是执行批处理任务的顶级概念。它由一系列步骤组成,可以有...
一、Spring Batch基本概念 1. **作业(Job)**:Spring Batch的核心概念,代表一个完整的批处理任务,可以由一个或多个步骤(Steps)组成。 2. **步骤(Step)**:作业的执行单元,每个步骤中包含读取(Read)、处理...
消息生产者使用了消息确认,消费者使用了事务 用到的包基本都是最近的新版本:spring-amqp-1.6.0.RELEASE.jar spring-rabbit-1.3.5.RELEASE.jar spring-retry-1.1.2.RELEASE.jar amqp-client-3.6.2.jar
- `mongo-java-driver`的版本选择上,请确保其兼容性,特别是当使用较新的`spring-data-mongodb`版本时,可能需要调整`mongo-java-driver`的版本。 - `spring-data-mongodb`提供了丰富的API用于操作MongoDB数据库,...
springbootexample-rest-retry-template 带有RestTemplate和RetryTemplate的Spring Boot示例 信用卡公司必须向其客户提供一种工具,以根据先前账单的简单平均值来预测下个月的账单金额。 该工具的输入将是从其CRM...
- **Retry & Rollback**:Spring Batch 支持重试和回滚机制,确保批处理的稳定性和数据一致性。 2. **源码结构:** - **BatchConfigurer**:配置批处理相关的属性,如 JobRepository 和 ItemReader。 - **...
- **Retry and Skip**: Spring Batch 支持对失败的 Step 进行重试或跳过,保证批处理任务的健壮性。 - **Transaction Management**: 批处理操作通常涉及大量的数据,Spring Batch 提供了事务管理,确保数据的一致...
- **Configuring Retry Logic (配置重试逻辑)**:定义当遇到某些异常时如何重试。 综上所述,Spring Batch 2.1.8 作为一款成熟且功能丰富的批处理框架,为开发者提供了强大的工具和支持,以满足各种批量数据处理的...
- **概念**:服务是Spring Cloud中最基本的单元,每个服务都代表了一个独立的应用程序。 - **组成部分**: - **commons通用项目**:包含公共组件、工具类等。 - **Itemservice商品服务**:处理商品相关的逻辑。 -...
《Spring Batch in Action》是2012年出版的一本专著,主要聚焦于Spring Batch框架的使用和实践。Spring Batch是Spring生态系统中的一个模块,专门用于处理批量处理任务,如数据导入导出、大数据量的计算等。本书旨在...
6. **Spring Boot @EnableAutoConfiguration**:针对Spring Boot应用,可以使用此注解来自动配置Spring Integration相关的组件和服务。 7. **@GlobalChannelInterceptor**:此注解允许在全局范围内定义通道拦截器,...
总结来说,RabbitMQ的Java开发涉及`amqp-client`库的基本使用,以及Spring的`spring-amqp`、`spring-rabbit`和`spring-retry`模块的集成。理解并熟练掌握这些知识点,将有助于构建高效、可靠的分布式系统。在实际...
使用Spring-rabbit,开发者可以轻松地在Spring应用中发送和接收消息,实现消息驱动的架构。它包括了模板(Template)用于发送消息,以及监听器容器(Listener Container)来处理接收的消息。此外,Spring-rabbit还...
- **Item**:Spring Batch 使用“Item”作为数据的基本单位,可以是数据库记录、文件行等。 - **Reader**:读取器(ItemReader)负责从数据源获取Item。 - **Processor**:处理器(ItemProcessor)对每个Item进行...
3. **事务管理**:Spring-Batch 使用Spring的事务管理能力,确保在步骤级别上的操作原子性,如果在处理过程中出现错误,可以回滚到之前的状态。 4. **跳过策略(Skip Policy)和恢复策略(Retry Policy)**:当处理...
**使用 Spring Batch 的优势:** 1. **可重用性** - 通过模块化设计,可以轻松复用已有的步骤和配置。 2. **可扩展性** - 面向接口的设计使得添加新的 Reader、Processor 和 Writer 变得简单。 3. **监控和调试** - ...
目前公司使用的SpringCloud整个技术组件,基本包含了上面图中所包含的,不得不说,SpringCloud整个生态真的很强大,使用起来也很方便有效。后面有时间再针对每个组件进行使用解读,这篇文章主要说下SpringCloud架构...