今天碰到个问题,xfire客户端调用远程的webservice服务器,在异常日志stdout中打了些read timeout 后,从jconsole观察到resin的线程数量直线上升,直到把所有线程都占满,后来看到是xfire的XFireClientFactoryBean的
getClient方法阻塞了,在网上查看了各种配置,均无效。后来把那台webService服务器放到公司内部网络就没有问题了
经验教训:
webservice超时问题,最关键的是要解决网络问题
在解决此问题后,回头再仔细分析成因。
首先在自己的测试环境中模拟这种连接超时的情况
1.把webService的wsdl地址配置成一个远程的无法访问的ip地址,提供一个url来模拟调用webService客户端
2.启动web服务器,用jconsole监控线程状况
3.用apache的ab工具,并发100个线程,请求第1步中的url
4.分析线程状态,找到上100个阻塞的线程,再找到拥有阻塞对象的线程,发现是阻塞在xfire的Resovler对象的方法里
最终阻塞是在url.openStream方法里,xfire调用webService会先验证wsdl的有效性,用的就是new URL(wsdl).openStream方法,这时网络不通,就会阻塞在此。这个url.openStream方法的超时时间并不能在xfire的参数中进行配置,是默认值。可以把wsdl文件配置在本地,会减少这种情况发生的可能性。
5.在调用webservice时的参数,可以参考以下配置
<property name="properties"> <props> <prop key="http.connection.manager.timeout">5000</prop> <prop key="http.connection.timeout">5000</prop> <prop key="http.timeout">5000</prop> <prop key="max.connections.per.host">200</prop> <prop key="max.total.connections">300</prop> <prop key="disable-keep-alive">true</prop> <prop key="disable.expect-continue">true</prop> </props> </property>
以上配置中各属性的含义需要明确
另外,纠正一个网上一个错误的概念,URLConnection的默认超时时间并不是0,0代表永不超时,只是代表没有设置而已,操作系统会提供一个默认的socket超时时间,我在windows的xp上测试的时间约为20秒,测试方法很简单,
URL url = new URL("http://10.1.1.1");
long now = System.currentMills();
try{
url.openStream();
}catch(Exception e){
System.out.println(System.currentMills()-now);
}
也可以用socket做实验效果一样。
分享到:
相关推荐
连接超时是指客户端尝试建立到服务器端的TCP连接时允许的最大时间。如果在这个时间内连接未建立成功,客户端将抛出一个异常。这可以防止因网络问题导致的长时间等待。 读取超时则是在连接成功建立后,客户端等待...
1. 创建客户端代理:XFire使用WSDL文档生成客户端代理类。这个代理类提供了服务方法的直接访问,就像调用本地方法一样。可以使用XFire的wsdl2java工具自动生成这些代理类。 2. 初始化代理:在调用服务之前,需要...
需要注意的是,实际应用中可能需要处理异常、配置认证信息以及调整请求超时等高级设置。此外,随着技术的发展,XFire 已经被 Apache CXF 所取代,虽然本文是关于 XFire 的,但现代的 Java 开发更倾向于使用 CXF 或...
CXF(CXF: Apache CXF, formerly XFire)是一个开源的Java框架,专门用于构建和消费Web服务。这个"CXF动态webservice客户端demo"是为了演示如何使用CXF库创建一个动态调用Web服务接口的客户端应用程序。 首先,我们...
5. **错误处理**:在处理网络请求时,要对可能出现的异常情况进行处理,如网络连接失败、超时等。通常通过捕获`IOException`和`InterruptedException`等异常来实现。 6. **存储管理**:下载的图片需要保存到设备上...
4. **错误处理**:xfire可能内置了对fetch请求的错误处理机制,如超时、网络错误等,使得在接口调用过程中能更好地捕获和处理异常情况。 5. **代码生成**:xfire可能会生成清晰、易于理解的代码结构,遵循最佳实践...
7. **异常处理**:网络请求可能出现各种异常,如网络连接失败、超时、服务器错误等,项目中应该有完善的异常处理机制,提供友好的错误提示。 8. **测试与调试**:在开发过程中,需要对上传和下载功能进行单元测试和...
- 在Spring配置文件中,定义一个`jaxws:client` bean,指定服务地址、服务接口和代理类,配置连接超时、重试策略等参数。 3. **XML请求与响应处理** 在Spring+CXF的环境中,XML请求通常是通过Java对象转换得到的...
2. **错误处理**:处理网络连接失败、超时、数据解析错误等各种异常情况。 3. **安全问题**:确保数据传输的安全性,可能需要使用HTTPS或对数据进行加密。 4. **性能优化**:减少网络请求次数,缓存数据,避免不必...
然后,`getClient().invoke("invokeMethodAutoExcute", new String[]{clazz})`使用XFIRE客户端调用名为`invokeMethodAutoExcute`的远程方法,并传入类名作为参数。 如果远程调用成功,结果会被存储在`objs`数组中,...