由于使用 xfire/HttpMethod 造成Socket连接池满的问题及解决办法
I/O exception (java.net.BindException) caught when processing request: Address already in use: connect (平台报出异常,传说该错误又socket连接满引起,故为上标题)
使用 XFire 访问webService, 运行一段时间后, 使用netstat -ano命令,发现服务器上有大量的CLOSE_WAIT连接,导致之后的WebService服务访问经常失败。
原因如下:
CLOSE_WAIT是Tcp状态迁移中的一个
当服务端主动关闭而客户端没来及响应进入的一个的状态,此状态TCP层默认时间大概为2小时左右
故导致了达到最大连接数出现了假死
解决办法:
对于使用httpclient的程序
只需要在HttpMethod method = new GetMethod("url");加上一行HTTP头的设置即可
method.setRequestHeader("Connection", "close");
对于使用xFire的程序
xFire是基于PostMethod实现的,CommonsHttpMessageSender类中会读取DISABLE_KEEP_ALIVE属性如果值为true的话,那么就会将PostMethod加入 Connection close的属性
在实例化httpClient对象后,添加下面一行代码即可
client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE, "true")
=====================================================================================================
XFire平台下的连接超时设置
100 (continue) read timeout. Resume sending the request
public Client loadClient() throws MalformedURLException, Exception{
Client client = new Client(new URL(url));
client.setTimeout(20000);
HttpClientParams params = new HttpClientParams();
// 避免'Expect: 100-continue' handshake
params.setParameter(HttpClientParams.USE_EXPECT_CONTINUE,Boolean.FALSE);
//设置ws连接超时时间
params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, 20000l);
client.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_PARAMS,params);
return client;
}
以上的做法在实际项目中发现行不通,现修改为:
URL _url = new URL(url);
HttpURLConnection httpConnection = (HttpURLConnection)_url.openConnection();
httpConnection.setReadTimeout(20000);//设置http连接的读超时,单位是毫秒
httpConnection.connect();
Client _client = new Client(httpConnection.getInputStream(), null);
_client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, String.valueOf( 20000 ));//设置发送的超时限制,单位是毫秒;
_client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE, "true");
_client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE, "true");
实践检验,可行!
======================================================================================================
以上从网上搜到两种解决办法,首先觉的最终原因是因为使用 xfire/HttpMethod 造成Socket连接池满,所以标题使用此标题。
第一种方法和第二种方法解决理论一致,出发点也一致,只不过设置的参数不一致。
其他,,,是否能解决正在论证中。。。
另外还有中办法,网上说这种办法的人很多,不过我觉得是治标不治本
短时间内new socket操作过多
而socket.close()操作并不能立即释放绑定的端口
而是把端口设置为TIME_WAIT状态
过段时间(默认240s)才释放(用netstat -na可以看到)
最后系统资源耗尽
(windows上是耗尽了pool of ephemeral ports 这段区间在1024-5000之间)
可以考虑增加端口数量来解决,不过你为何不考虑用Socket池呢?让一个Socket重复利用呢?
以下是修改方法
默认最大数量的短暂 TCP 端口为 5000 ' 适用于 ' 部分中包含产品中。 这些产品中已添加新参数。 要增加最大值是短暂端口, 请按照下列步骤操作:
1.
启动注册表编辑器。
2.
注册表, 中找到以下子项, 然后单击 参数 :
HKEY _ LOCAL _ MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.
在 编辑 菜单, 单击 新建 , 然后添加以下注册表项:
MaxUserPort 值名称:
值类型: DWORD
值数据: 65534
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
说明: 此参数控制程序从系统请求任何可用用户端口时所用最大端口数。 通常, 1024 的值和含 5000 之间分配临时 (短期) 端口。
4.
退出注册表编辑器, 并重新启动计算机。
注意 一个附加 TCPTimedWaitDelay 注册表参数决定多久关闭端口等待可以重用关闭端口。
相关推荐
<param-value>classpath:spring/app.xml,classpath:org/codehaus/xfire/spring/xfire.xml</param-value> </context-param> <!--配置xfire ws--> <servlet-name>XFireServlet</servlet-name> ...
本例子使用XFire发布WebService+XFire调用WebService-示例
WebService应用中 Xfire使用说明文档
在 MyEclipse 上使用 XFire 编写 Web Service.rar在 MyEclipse 上使用 XFire 编写 Web Service.rar在 MyEclipse 上使用 XFire 编写 Web Service
1、以下四个类调用了XmlSchema-1.1.jar包 因与cxf包xmlschema-core-*.jar... xfire-all-1.2.6-incomplete.jar 替换 xfire-all-1.2.6.jar 3、XmlSchema-1.1.jar 可以与 xmlschema-core-*.jar 共存避开同路径同名类冲突
此程序demo详细描述的从发布接口到调用接口的全部过程,详细描述了Xfire调用webservice参数无法传递的问题。
以下四个类调用了XmlSchema-1.1.jar包 因与cxf包xmlschema-core-*.jar 冲突 ... xfire-all-1.2.6-incomplete.jar 替换 xfire-all-1.2.6.jar XmlSchema-1.1.jar 可以与 xmlschema-core-*.jar 共存避开同路径同名类冲突
用java通过xfire框架实现ws,实现正向生成wsdl文件,并由wsdl逆向生成java ws客户端代码 测试输入:http://localhost:8080/webservice-xfire/services/CalculatorService?wsdl
1、在Springmvc中放入xfire1.2.6jar,按照注解的方式配置后,springMVC启动不会扫描collection,后面修改了配置方式,web.xml使用org.codehaus.xfire.transport.http.XFireConfigurableServlet,xfire/services.xml...
spring+xfire集成解决方案spring+xfire集成解决方案
完整的一个demo,使用xfire发布的员工管理类Demo,操作方法包括,增删改查基本四个操作。初学时做的练习用的
java使用XFire调用webService接口
XFire1.2版本,其中修改了META-INF/services 目录下的javax.xml.ws.spi.Provider文件,解决因为jdk1.6和XFire的架包冲突问题
xfire 1.26 博文链接:https://qgl.iteye.com/blog/119726
此程序demo详细描述的从发布接口到调用接口的全部过程,详细描述了Xfire调用webservice参数无法传递的问题。
1、以下四个类调用了XmlSchema-1.1.jar包 因与cxf包xmlschema-core-*.jar... xfire-all-1.2.6-incomplete.jar 替换 xfire-all-1.2.6.jar 3、XmlSchema-1.1.jar 可以与 xmlschema-core-*.jar 共存避开同路径同名类冲突
xfire 使用外部类、返回collection及输入数组参数示例
2 使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现; 3 容易上手,可以方便快速地从pojo发布服务; 4 支持Spring、Pico、Plexus、Loom等容器; 5 灵活的Binding机制,包括默认的Aegis,...
使用xfire框架搭建的webService。主要有2个实例:SOAP Header中进行身份验证和WS-Security进行身份验证
这是一个使用MyEclipse6.5+Tomcat6.0演示的使用Xfire创建Web service和客户端使用的视频