【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试

这篇具有很好参考价值的文章主要介绍了【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我们的服务需要调用别人的接口,由于对方的接口服务不是很稳定,经常超时,于是需要增加一套重试逻辑。这里使用 Spring Retry 的方式来实现。

一、引入POM

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

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

二、 修改启动类

在Spring Boot 应用入口启动类,也就是配置类的上面加上@EnableRetry 注解,表示让重试机制生效。

【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试

@EnableRetry
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args)
    {
        SpringApplication.run(RuoYiApplication.class, args);
    }
}

注意:

我这里还注入了Bean,因为在启动项目是会报错。

@Bean
RestTemplate restTemplate(){
     return new RestTemplate();
 }

报错信息:

Field restTemplate in com.cloud.ribbon_consumer.project.service.HelloService required a bean of type 'org.springframework.web.client.RestTemplate' that could not be found.

问题原因:

Spring Boot 1.3版本中,会默认提供一个RestTemplate的实例Bean,而在 Spring Boot 1.4以及以后的版本中,这个默认的bean不再提供了,我们需要在Application启动时,手动创建一个RestTemplate的配置。

这样,我们在类中通过注解 @Autowired 使用 TestTemplate 的时候,程序就可以找到被实例化的 TestTemplate,就不会出现上述的报错了。

三、具体使用

写一个模拟的业务类RetryService ,在其里面注入RestTemplate 。

@Service
public class RetryService {
    private static Logger log = LoggerFactory.getLogger(RetryService.class);

    @Resource
    private RestTemplate restTemplate;

    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");


    @Retryable(value = RestClientException.class, maxAttempts = 3,
            backoff = @Backoff(delay = 5000L,multiplier = 2))
    public String getRequest(String address) {
        log.info("发起远程API 地址: {} ,请求事件: {}", address, DATE_TIME_FORMATTER.format(LocalDateTime.now()));

        ResponseEntity<String> responseEntity
                = restTemplate.getForEntity(address, String.class);

        // 获取响应结果
        return responseEntity.getBody();
    }
}
  1. @Retryable注解的方法在发生异常时会重试,参数说明:
  • value:当指定异常发生时会进行重试 ,HttpClientErrorException是RestClientException的子类。
  • include:和value一样,默认空。如果 exclude也为空时,所有异常都重试
  • exclude:指定异常不重试,默认空。如果 include也为空时,所有异常都重试
  • maxAttemps:最大重试次数,默认3
  • backoff:重试等待策略,默认空
  1. @Backoff注解为重试等待的策略,参数说明:
  • delay:指定重试的延时时间,默认为1000毫秒
  • multiplier:指定延迟的倍数,比如设置delay=5000,multiplier=2时,第一次重试为5秒后,第二次为10(5x2)秒,第三次为20(10x2)秒。

四、测试

我这里写了一个不存在的服务,用于测试重试机制

 @GetMapping(value = "/update1")
    public String updatePingTai1() {
        String request = retryService.getRequest("http://127.0.0.1:3214");
        return request);
    }

【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试

这里可以看到我们是重试了三次,才抛出的异常。文章来源地址https://www.toymoban.com/news/detail-475118.html

参考:

  1. https://www.cnblogs.com/zimug/p/13507850.html
  2. https://www.cnblogs.com/liuyupen/p/13957171.html#%E6%96%B9%E5%BC%8F%E5%9B%9Bspring-%E8%87%AA%E5%B8%A6%E9%87%8D%E8%AF%95%E5%B7%A5%E5%85%B7
  3. https://www.cnblogs.com/liuyupen/p/13957171.html#%E6%96%B9%E5%BC%8F%E5%9B%9Bspring-%E8%87%AA%E5%B8%A6%E9%87%8D%E8%AF%95%E5%B7%A5%E5%85%B7

到了这里,关于【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot中RestTemplate的使用备忘

    2-1 引入Maven依赖 2-2 创建 RestTemplate 配置类,设置连接池大小、超时时间、重试机制等等。 4-1 使用示例 4-2 参数传递的几种方式 5-1 使用示例 5-2 参数传递的几种方式 6-1 使用示例 6-2 设置 url 参数,同Get请求 7-1 使用示例,和postForObject()基本相似,返回的是ResponseEntity罢了 7-2 设置

    2024年02月02日
    浏览(41)
  • springboot使用restTemplate调用webservice接口

    1.首先确定wsdl的http地址,使用postman测试接口是否成功  在浏览器输入webservice地址可以找到相应的请求和响应示例。    如果postman返回了正确的数据,就说明测试成功! 2.接下来代码:

    2024年01月16日
    浏览(59)
  • SpringBoot 使用RestTemplate来调用https接口

    使用RestTemplate来访问第三方https接口,接口类型为POST,返回数据为JSON,需要忽略https证书,因此对RestTemplate 进行配置,通过HttpClient的请求工厂(HttpComponentsClientHttpRequestFactory)进行构建。HttpComponentsClientHttpRequestFactory使用一个信任所有站点的HttpClient就可以解决问题了。 中间

    2024年02月13日
    浏览(51)
  • SpringBoot 使用 RestTemplate 发送 binary 数据流

    情况说明: 接口A接受到一个数据流,在postman里的传输方式显示如下: 接口A接受到这个数据流之后,需要转发到接口B进行处理。 这里要注意一点是: postman图中的这种方式和MultipartFile流的传输方式不同,MultipartFile流方式,是在body的form表单中进行传输,需要指定一个key,这

    2024年02月12日
    浏览(41)
  • SpringBoot | RestTemplate异常处理器ErrorHandler使用详解

    关注wx:CodingTechWork   在代码开发过程中,发现很多地方通过 RestTemplate 调用了第三方接口,而第三方接口需要根据某些状态码或者异常进行重试调用,此时,要么在每个调用的地方进行异常捕获,然后重试;要么在封装的 RestTemplate 工具类中进行统一异常捕获和封装。当然

    2024年02月12日
    浏览(43)
  • SpringBoot之RestTemplate使用Apache的HttpClient连接池

    SpringBoot自带的RestTemplate是没有使用连接池的,只是SimpleClientHttpRequestFactory实现了ClientHttpRequestFactory、AsyncClientHttpRequestFactory 2个工厂接口,因此每次调用接口都会创建连接和销毁连接,如果是高并发场景下会大大降低性能。因此,我们可以使用Apache的HttpClient连接池。

    2024年02月11日
    浏览(44)
  • 【SpringBoot教程】SpringBoot开发HTTP接口GET请求实战

    ⛪ 专栏地址 系列教程更新中 🚀 专栏介绍: 本专栏为SpringBoot+Spring+Mybatis的系列零基础教程,从框架的基础知识讲起,从0开始实现一个在线教育实战项目 🚀 源码获取 : 项目中的资料可以通过文章底部公众号联系我获取,或者+V 【yopa66】备注SSM 1.快速创建一个SpringBoot项目 项

    2024年02月01日
    浏览(50)
  • java基于RestTemplate的微服务发起http请求

    实现的效果

    2024年02月05日
    浏览(41)
  • SpringBoot中RestTemplate和WebClient的使用区别及优缺点含完整代码

    点击下载《SpringBoot中RestTemplate和WebClient的使用区别及优缺点含完整代码》 本文将深入探讨Spring Boot中RestTemplate和WebClient的用法、区别和优缺点。通过具体的代码示例,我们将详细解释这两种HTTP客户端的使用方法,并分析它们在不同场景下的适用性。 RestTemplate是Spring框架中用

    2024年02月19日
    浏览(43)
  • Http请求实战 ---- 【restTemplate.exchange方法】的简单了解应用

    RestTemple是Spring提供的用于访问Http请求的客户端; 相对于apache的HTTPClient类,逻辑繁琐,代码复杂,还要自己编写使用类HttpClientUtil,封装对应的post,get,delete等方法。 RestTemplate可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包