java.net.SocketTimeoutException:Read timed out问题解决
问题描述
利用WebService给其它服务器地址发送请求时,遇到了一个报错:org.apache.cxf.interceptor.Fault:Could not receive Message。
控制台上显示:java.net.SocketTimeoutException:Read timed out。
搜了一下发现网上大部分是分享org.apache.cxf.interceptor.Fault:Could not send Message。
发送问题的,很少有关于接收报错的。本文就是介绍如何解决这个问题的。
一、WebService是什么?
简单说:WebService可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.
详细介绍: WebService详解
二、问题解决
1.问题分析
以下内容来自: CXF客户端配置请求超时限制
在Spring+CXF的WebService环境下,客户端有两个时间属性是可配置的,分别是ConnectionTimeout和ReceiveTimeout.
ConnectionTimeout–WebService以TCP连接为基础,这个属性可以理解为tcp的握手时的时间设置,超过设置的时间长则认为是连接超时.以毫秒为单位,默认是30000毫秒,即30秒.
ReceiveTimeout – 这个属性是发送WebService的请求后等待响应的时间,超过设置的时长就认为是响应超时.以毫秒为单位,默认是60000毫秒,即60秒.
出现java.net.SocketTimeoutException:Read timed out。
说明发送或接收时等待的时间过长,超过了限制就会报错。
2.解决办法
(1)延长响应时间限制
可能出现以下几种情况
(1)有时候网络会存在波动情况
(2)传输的数据量过大
(3)服务器响应时间过长
因此,我们可以适当延长请求等待响应时间,来解决以上问题
Java代码如下:
Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
//均以毫秒为单位
httpClientPolicy.setConnectionTimeout(60000);
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setReceiveTimeout(120000);
http.setClient(httpClientPolicy);
(2)联系服务器使用方解决
我遇到的报错是:org.apache.cxf.interceptor.Fault:Could not receive Message
显示无法接收信息,不是无法发送信息。我这边报错了联系了服务器使用方,他们那边显示已经接收到了我发送的请求,是他们的服务器没有响应我这边的服务器才会报错。他们在调试后,让我重新发送请求,我尝试发送请求后就不再报org.apache.cxf.interceptor.Fault:Could not receive Message
问题了。因此,出现这个问题的小伙伴可以尝试联系服务器使用方解决。
当然,联系前要确定:
(1)自己发送的参数信息没有问题,符合接口规范要求
(2)请求已经发送出去(关键)。要确保自己的请求发送出去了,是他们的响应问题。
总结
我遇到的是一个很小众的问题,大多数开发者应该遇到的是发不出去请求,而我遇到的是接收不到请求。
我这次分享的经验仅供大家参考,希望对大家有所帮助!