1. 问题描述
对接第三方系统使用cxf框架时测试数据的时候一切正常, 当传递附件后报出了java.net.SocketTimeoutException: Read timed out, 传输的文件使用base64编码,传输较大一点的文件之后就会造成这个异常, 当时对于这个问题考虑以下几个问题
1. 网络问题: 是否是网络连接不稳定导致的。更换了网络测试后这个问题直接排除。
2. 服务器响应过慢, 怀疑是接口响应过慢,于是postman测试, 响应速度很快,传递较大点的文件也没有任何问题,考虑应该是cxf框架哪些配置不到位造成的
于是经过查阅资料,找到问题的原因, 大概是服务器因为读取的数据过长造成超出预设的时间. 通过设置连接超时时间,及接收超时时间, 成功解决这个问题.
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(); Client client = factory.createClient(URL); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(50000);//连接超时时间 httpClientPolicy.setReceiveTimeout(50000);//接收超时时间 httpClientPolicy.setAllowChunking(false); http.setClient(httpClientPolicy);
setConnectionTimeout() //
设置连接超时时间,单位毫秒
setAllowChunking(false) //
用于禁用分块传输。
setReceiveTimeout() //
设置接收超时时间, 单位毫秒