`
m635674608
  • 浏览: 5027997 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring retry基本使用

 
阅读更多

背景介绍

在实际工作过程中,重试是一个经常使用的手段。比如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 和 Guava Retrying重试机制的使用详解

    Spring-Retry更适合已经使用Spring框架的项目,因为它提供了声明式重试,集成简单,但在定制性上可能略逊于Guava Retrying。而Guava Retrying则适用于对重试逻辑有高度定制需求的场景,但可能需要更多的编码工作。 ...

    spring-retry:spring 重试模板示例

    默认情况下,Spring Retry 会记录基本信息到日志。 ```java @Bean public RetryListener myRetryListener() { return new RetryListenerSupport() { @Override public , E extends Throwable&gt; boolean open...

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

    1. **数据迁移**: 使用 Spring Batch 实现大规模数据迁移,例如从旧数据库到新数据库的转换。 2. **报告生成**: 处理大量数据生成报表,如日志分析、财务报告等。 3. **定时任务**: 结合 Quartz 或者 Spring ...

    详细spring batch资料

    在本文中,我们将深入探讨Spring Batch的基本概念、核心组件以及如何在实际项目中应用它。 1. **基本概念** - **作业(Job)**:在Spring Batch中,作业是执行批处理任务的顶级概念。它由一系列步骤组成,可以有...

    spring batch指南

    一、Spring Batch基本概念 1. **作业(Job)**:Spring Batch的核心概念,代表一个完整的批处理任务,可以由一个或多个步骤(Steps)组成。 2. **步骤(Step)**:作业的执行单元,每个步骤中包含读取(Read)、处理...

    rabbitmq+spring3 jar包及配置

    消息生产者使用了消息确认,消费者使用了事务 用到的包基本都是最近的新版本: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

    mongodb整合spring文档

    - `mongo-java-driver`的版本选择上,请确保其兼容性,特别是当使用较新的`spring-data-mongodb`版本时,可能需要调整`mongo-java-driver`的版本。 - `spring-data-mongodb`提供了丰富的API用于操作MongoDB数据库,...

    springbootexample-rest-retry-template:带有RestTemplate和RetryTemplate的Spring Boot示例

    springbootexample-rest-retry-template 带有RestTemplate和RetryTemplate的Spring Boot示例 信用卡公司必须向其客户提供一种工具,以根据先前账单的简单平均值来预测下个月的账单金额。 该工具的输入将是从其CRM...

    spring batch 源码

    - **Retry & Rollback**:Spring Batch 支持重试和回滚机制,确保批处理的稳定性和数据一致性。 2. **源码结构:** - **BatchConfigurer**:配置批处理相关的属性,如 JobRepository 和 ItemReader。 - **...

    Spring Batch 演示

    - **Retry and Skip**: Spring Batch 支持对失败的 Step 进行重试或跳过,保证批处理任务的健壮性。 - **Transaction Management**: 批处理操作通常涉及大量的数据,Spring Batch 提供了事务管理,确保数据的一致...

    spring batch 2.1.8版本

    - **Configuring Retry Logic (配置重试逻辑)**:定义当遇到某些异常时如何重试。 综上所述,Spring Batch 2.1.8 作为一款成熟且功能丰富的批处理框架,为开发者提供了强大的工具和支持,以满足各种批量数据处理的...

    spring cloud 入门操作手册(全).pdf

    - **概念**:服务是Spring Cloud中最基本的单元,每个服务都代表了一个独立的应用程序。 - **组成部分**: - **commons通用项目**:包含公共组件、工具类等。 - **Itemservice商品服务**:处理商品相关的逻辑。 -...

    Maning.Spring.Batch.in.Action.2012

    《Spring Batch in Action》是2012年出版的一本专著,主要聚焦于Spring Batch框架的使用和实践。Spring Batch是Spring生态系统中的一个模块,专门用于处理批量处理任务,如数据导入导出、大数据量的计算等。本书旨在...

    spring-integration

    6. **Spring Boot @EnableAutoConfiguration**:针对Spring Boot应用,可以使用此注解来自动配置Spring Integration相关的组件和服务。 7. **@GlobalChannelInterceptor**:此注解允许在全局范围内定义通道拦截器,...

    rabbitmq 所需jar包

    总结来说,RabbitMQ的Java开发涉及`amqp-client`库的基本使用,以及Spring的`spring-amqp`、`spring-rabbit`和`spring-retry`模块的集成。理解并熟练掌握这些知识点,将有助于构建高效、可靠的分布式系统。在实际...

    RabbitMQ-3.4.1安装文件+Spring-rabbit+RabbitMQ-3.4.1安装手册

    使用Spring-rabbit,开发者可以轻松地在Spring应用中发送和接收消息,实现消息驱动的架构。它包括了模板(Template)用于发送消息,以及监听器容器(Listener Container)来处理接收的消息。此外,Spring-rabbit还...

    Spring Batch 2.1.8

    - **Item**:Spring Batch 使用“Item”作为数据的基本单位,可以是数据库记录、文件行等。 - **Reader**:读取器(ItemReader)负责从数据源获取Item。 - **Processor**:处理器(ItemProcessor)对每个Item进行...

    spring-batch

    3. **事务管理**:Spring-Batch 使用Spring的事务管理能力,确保在步骤级别上的操作原子性,如果在处理过程中出现错误,可以回滚到之前的状态。 4. **跳过策略(Skip Policy)和恢复策略(Retry Policy)**:当处理...

    spring-batch-master.zip

    **使用 Spring Batch 的优势:** 1. **可重用性** - 通过模块化设计,可以轻松复用已有的步骤和配置。 2. **可扩展性** - 面向接口的设计使得添加新的 Reader、Processor 和 Writer 变得简单。 3. **监控和调试** - ...

    SpringCloud微服务架构全链路实践

    目前公司使用的SpringCloud整个技术组件,基本包含了上面图中所包含的,不得不说,SpringCloud整个生态真的很强大,使用起来也很方便有效。后面有时间再针对每个组件进行使用解读,这篇文章主要说下SpringCloud架构...

Global site tag (gtag.js) - Google Analytics