SocketTimeoutException:Read timed out问题解决org.apache.cxf.interceptor.Fault:Could not receive Message


问题描述

利用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)请求已经发送出去(关键)。要确保自己的请求发送出去了,是他们的响应问题。

总结

我遇到的是一个很小众的问题,大多数开发者应该遇到的是发不出去请求,而我遇到的是接收不到请求。
我这次分享的经验仅供大家参考,希望对大家有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值