记一次RestTemplate.getForObject线程阻塞

项目定时任务未按时执行,项目中多处使用@Scheduled实现定时执行,项目上线后一直运行稳定,近期忽然出现定时任务未按时执行。
排查步骤:
① 查看日志,观察到在执行其中一个定时任务时,任务只走了一半,就没有执行记录了;无报错无异常信息(由于@Scheduled默认单线程执行,故此猜测可能是线程阻塞或者意外死亡)
② 查询线程堆栈信息,查看线程状态;
首先查询进程pid

ps -ef|grep jar包全名 # 查看进程pid

在这里插入图片描述

然后查询线程堆栈

jstack pid # 查看线程堆栈信息

在这里插入图片描述
看到线程状态一直为runnable,进入假死状态,判断线程应该时阻塞了,线程一直卡在WarnDataTimer的1043行处,查看代码此处为请求第三方接口;

③ 写代码测试第三方接口发现在请求时,执行请求接口的时候,会出现第三方接口一直连接不上的情况,由于RestTemplate继承HttpAccessor,连接超时为-1,也就是没有超时时间,会一直等待连接,导致线程阻塞无法往下执行。
在这里插入图片描述
处理办法自定义一个连接工程

SimpleClientHttpRequestFactory clientFactory = new SimpleClientHttpRequestFactory();
clientFactory.setConnectTimeout(10); //建立连接的超时时间  5秒
clientFactory.setReadTimeout(10); // 传递数据的超时时间(在网络抖动的情况下,这个参数很有用)

RestTemplate restTemplate = new RestTemplate(clientFactory);

捕获一下异常RestClientException

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`restTemplate.getForObject()` 是 Spring Framework 提供的一个用于发送 HTTP GET 请求并获取响应结果的方法。它可以方便地发送 GET 请求并将响应结果转换为指定的 Java 对象。 下面是使用 `restTemplate.getForObject()` 方法发送 GET 请求的示例代码: ```java RestTemplate restTemplate = new RestTemplate(); // 发送 GET 请求,并将响应结果转换为指定的 Java 对象 Object response = restTemplate.getForObject("http://api.example.com/resource", Object.class); // 处理响应结果 // ... ``` 在上述示例代码中,我们创建了一个 `RestTemplate` 实例,并使用 `getForObject()` 方法发送了一个 GET 请求。`getForObject()` 方法接受两个参数:请求的 URL 和要转换的响应结果的类型。 在实际使用中,你需要将请求的 URL 替换为你要发送 GET 请求的目标 URL,并根据实际情况指定要转换的响应结果的类型。例如,如果你期望将响应结果转换为一个自定义的 Java 对象,你可以将 `Object.class` 替换为你自己定义的类。 注意,`getForObject()` 方法会阻塞当前线程,到接收到完整的响应结果。如果你需要异步发送请求或处理大量并发请求,可以考虑使用 `RestTemplate` 的其他方法,如 `getForEntity()` 或 `exchange()`,它们提供了更多的灵活性和控制能力。 此外,还需要确保在使用 `RestTemplate` 之前已经配置了相关的 HTTP 客户端,以便实现与目标 URL 的通信。这可以通过添加适当的依赖和配置来完成,具体取决于你使用的 Spring 版本和所需的 HTTP 客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈哈都疯了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值