`
yancaofei
  • 浏览: 3916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由于使用 xfire/HttpMethod 造成Socket连接池满的问题及解决办法

 
阅读更多

由于使用 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 注册表参数决定多久关闭端口等待可以重用关闭端口。

分享到:
评论

相关推荐

    Java使用XFire调用WebService接口

    例如,可以通过缓存代理类、调整HTTP连接池大小等方式提升调用性能。 9. **安全性**:对于涉及到敏感数据或认证的Web服务,XFire也提供了安全特性,如SSL/TLS加密、WS-Security等,以保护通信的安全。 10. **持续...

    xfire的使用详解

    <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无法接收到参数问题解决"指出的核心问题是:当使用Xfire作为客户端调用Web服务时,服务端无法正确接收到传递的参数。这可能是由于多种原因引起的,如: 1. **XML序列化与反序列化问题**:...

    java使用XFire调用webService接口

    "Java 使用 XFire 调用 webService 接口" 在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单...

    Xfire使用说明文档

    Xfire 是一个已不再维护的开源项目,它主要用于创建和消费Web服务,特别是在Java应用程序中。这个使用说明文档主要介绍了如何在服务端发布WebService以及客户端如何调用这些服务。 一、服务端WebService的发布 1. ...

    使用XFire发布WebService

    【标题】: 使用XFire发布WebService 在Web服务的世界中,XFire是一个强大的开源框架,它使得开发和部署Web服务变得简单。XFire是Apache CXF的前身,它提供了全面的WS-*支持,包括SOAP、WSDL、UDDI、MTOM等标准,...

    Xfire调用webservice无法传递参数问题

    在本文中,我们将深入探讨Xfire调用Web服务时遇到的参数传递问题以及解决策略。 首先,让我们了解Web服务的基本概念。Web服务基于SOAP(Simple Object Access Protocol)协议,通过HTTP协议进行通信,使得不同的...

    使用XFire开发一个简单的web服务

    2. **复制到Tomcat**:将`bin`目录下的所有文件复制到`Tomcat/webapps/xfire/WEB-INF/classes`目录下。 3. **启动Tomcat**:启动Tomcat服务器,通过浏览器访问`...

    cxf和xfire的jar包冲突解决

    这个问题在标题“cxf和xfire的jar包冲突解决”中得到了明确指出。 Apache CXF是一个全面的服务开发框架,它支持SOAP、RESTful Web服务,以及多种协议和绑定。而XFire是CXF的前身,也是一个强大的Web服务框架,但它...

    使用xfire实现webservice实例

    HelloWorldService service = new ServiceFactory().create(HelloWorldService.class, "http://localhost:8080/xfire/hello"); String response = service.sayHello("World"); ``` **5. XFire与Spring集成** XFire...

    在 MyEclipse 上使用 XFire 编写 Web Service

    在 MyEclipse 上使用 XFire 编写 Web Service.rar在 MyEclipse 上使用 XFire 编写 Web Service.rar在 MyEclipse 上使用 XFire 编写 Web Service

    使用xfire发布的webservice完整实例

    【xfire与Web服务简介】 Xfire是一款开源的Java库,用于构建Web服务客户端和服务端。它基于SOAP协议,提供了一种简单的方式来创建、部署和消费Web服务。Xfire简化了开发过程,使得开发者可以专注于业务逻辑,而不是...

    java 调用webservice使用HttpClient和XFire两种方式

    本文将详细介绍如何使用HttpClient和XFire这两种不同的库来调用Web Service,特别是针对短信接口的调用。 首先,让我们了解Web Service的基本概念。Web Service是一种基于互联网的、平台无关的交互方式,它允许不同...

    eclipse 使用xfire开发webservices server

    本文将深入探讨如何使用Eclipse集成开发环境(IDE)结合XFire库来开发Web服务服务器端。XFire是Apache CXF的一部分,是一个轻量级、高性能的Java Web服务框架,支持SOAP、WS-*规范以及RESTful风格的服务。 首先,...

    xfire与cxf包冲突解决方案

    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和spring的集成 web service 面向服务编程 java

    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" /> ``` #### 3.2 spring.xfire.xml 创建专门管理XFire的配置文件`spring.xfire.xml`,在这个文件中,定义Web Service的服务端点、绑定和行为。...

    Eclipse上使用XFire开发

    ### Eclipse上使用XFire开发WebService知识点详解 #### 一、概述 本文主要介绍如何在Eclipse平台上使用XFire框架来开发WebService。通过本教程的学习,读者可以了解到搭建环境的具体步骤,以及实现一个简单的...

    xfire与cxf解决冲突

    以下四个类调用了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 共存避开同路径同名类冲突

    xfire-all-1.2.6 架包冲突解决版本

    XFire1.2版本,其中修改了META-INF/services 目录下的javax.xml.ws.spi.Provider文件,解决因为jdk1.6和XFire的架包冲突问题

    xfire客户端jar包

    在描述中提到的"Demo样板",通常是一个预配置的示例程序,用于演示如何使用xfire客户端来连接和调用Web服务。然而,由于每个Web服务都有其特定的WSDL(Web服务描述语言)文件,定义了服务的接口和操作,因此这个Demo...

Global site tag (gtag.js) - Google Analytics