如何使用 Spring RetryTemplate

计算场景中,网络是其中的一个重要部分。实际情况下的网络环境没有开发环境的网络那么稳定,所以在云计算中,网络是不可靠的已经成为了一条默认的潜规则。在系统研发的过程中,满足正常的业务需求的必要前提下,系统的鲁棒性,容错性也成为了一个重要的技术需求。

在网络不可靠的环境中,要保证业务流程,就需要在网络异常时对流程异常环节进行重试处理。

Spring框架为我们提供了重试机制,接下来我们来试验下Spring的重试。

Maven Dependency

假设项目是Maven管理的,需要在家pom中增加spring-retry包的依赖。

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

创建Spring Retry Template

创建一个Bean配置类来管理bean,使用@EnableRetry来启用Spring重试,通过@Bean注解创建一个RetryTemplate加入Spring Container。配置最大重试次数为4。

@Configuration
@EnableRetry
public class BeanSeederServices {

    @Bean
    public RetryTemplate retryTemplate() {
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(4);
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(3000);
        RetryTemplate template = new RetryTemplate();
        template.setRetryPolicy(retryPolicy);
        template.setBackOffPolicy(backOffPolicy);
        return template;
    }
}

构建重试逻辑

创建一个Service,在里面使用我们构建的RetryTemplate,将需要重试的业务逻辑交给RetryTemplate。

@Service
public class ConfigureNetworkService
{

  @Autowired
  private RetryTemplate retryTemplate;
  int counter =0;
  private void configureNetworkSystem(){
   retryTemplate.execute(
       context -> {
                   verifyNwConfiguration();
                    return true;
                });  
  }
  
  private void verifyNwConfiguration(){
    counter++;
    LOGGER.info("N/W configuration Service Failed "+ counter);
    throw new RuntimeException();
  }
}

创建一个Controller,用来提供执行入口,通过url来触发我们的重试功能。

@RestController
@RequestMapping(value="/networksrv")
public class NetworkClientService {
    @Autowired
    private ConfigureNetworkService configureNetworkService;
    @GetMapping
    public String callRetryService() throws SQLException {
        return configureNetworkService.configureNetworkSystem();
    }
}

在控制台我们会看到Spring输出的重试日志

2020-06-16 09:59:51.399  INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService       : N/W configuration Service Failed  1
2020-06-16 09:59:52.401  INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService       : N/W configuration Service Failed  2
2020-06-16 09:59:53.401  INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService       : N/W configuration Service Failed  3
2020-06-16 09:59:53.402  INFO 17288 --- [nio-8080-exec-1] c.e.springretrydemo.NetworkClientService       : N/W configuration Service Failed  4
Exception in thread "NetworkClientService" java.lang.RuntimeException

总结

通过使用Spring RetryTemplate,我们只需要关心具体的业务逻辑,不在用开发重试处理逻辑了。

原文 

https://mp.weixin.qq.com/s/9RWyfMfG0OYU5iexM88FbA

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 如何使用 Spring RetryTemplate

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址