RestTemplate报错I/O error on POST request for "http://crmjob.xxx.xxx.com/removeJob": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out问题处理

  • 问题复现
  • 问题分析
  • 处理方案
  • 为什么需要增加 -Djava.net.preferIPv4Stack=true


问题复现

最近在工作中遇到了一个问题,在使用RestTemplate调用接口的时候出现了报错I/O error on POST request for “http://crmjob.xxx.xxx.com/removeJob”: Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out,

Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out问题处理_.net

问题分析

对于这个问题的出现,一时也是没有方向,这个功能没动过但是突然出现这样的报错,于是把调用的开发环境的接口拿出来放在浏览器或者postman上面调用都是没有问题的

Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out问题处理_preferIPv4Stack_02


而通过RestTemplate的调用却会报错I/O error on POST request for。

处理方案

查阅了网上的解决方案,说添加证书什么的,但是我们的是http请求,并不需要证书,于是此方案不可行。后又查阅了其他解决方案,说由于 RestTemplate 调用需要配置容器属性 VM options

-Djava.net.preferIPv4Stack=true

那么配置本地springboot项目的 VM options后重启项目尝试

Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out问题处理_开发语言_03


再次进行尝试之后就可以了

Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out问题处理_preferIPv4Stack_04

为什么需要增加 -Djava.net.preferIPv4Stack=true

配置 -Djava.net.preferIPv4Stack=true 的原因是为了强制 Java 虚拟机(JVM)优先使用 IPv4 网络协议栈进行网络通信。这通常在 IPv4 和 IPv6 都被支持的系统中发生,但你想要你的 Java 应用程序仅使用 IPv4 进行网络通信时使用。