`
james_lover
  • 浏览: 44571 次
社区版块
存档分类
最新评论

记一次“Axis2客户端调用产生大量CLOSE_WAIT连接”的解决过程

阅读更多
背景: 程序使用1.6.2版本的axis2做WebService客户端调用。
代码:
public static Object sendRequest(Object req) throws AxisFault
{
	String returnMsg = "";
	RPCServiceClient serviceClient = null;
	serviceClient = new RPCServiceClient();
	Options options = serviceClient.getOptions();
	EndpointReference targetEPR = new EndpointReference(PropertiesUtils.getproperty("send.ws.targetEPR", ""));
	
	options.setTo(targetEPR);
	options.setTimeOutInMilliSeconds(Long.valueOf(PropertiesUtils.getproperty("send.ws.timeout", "30000")));
	//设置客户端关闭连接
	//options.setProperty(HTTPConstants.HEADER_CONNECTION, HTTPConstants.HEADER_CONNECTION_CLOSE);
	
	QName opAddEntry = new QName(PropertiesUtils.getproperty("send.ws.namespace", ""), PropertiesUtils.getproperty("send.ws.method", ""));
	Object[] opAddEntryArgs = new Object[] { req };
	Class[] classes = new Class[] { String.class };
	log.info("发送请求XML:"+req);
	returnMsg = (String) serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0];
	log.info("收到返回XML:"+returnMsg);
	return returnMsg;

}
 现象:程序上线后,观察WebService的调用情况,发现服务端响应很慢(服务端是另一家厂商,动不了他),每个请求延时都在5秒左右,在使用netstate查看连接数的时候,意外发现了程序产生大量CLOSE_WAIT状态的连接,而且数量稳定增长,一个小时就接近300个连接。
#netstat -tnp|grep 7011|grep CLOSE_WAIT|wc -l
#271

 

折腾:发现这个问题后,就开始baidu.然后各种折腾。axis2的HTTPConstants.HEADER_CONNECTION ,

HEADER_CONNECTION_KEEPALIVE参数沾边的都试了遍,无效果。

两个小时过去了,没有进展。

 

看着一直增长的连接数,好象血管在一直流血一样。这样下去内存应该也会增长吧。看看jvm内存是不是有对象泄漏,导致HttpClient没有回收(axis2底层使用这个类发送WebService请求)?

 

jmap -histo 18041 |grep com.xxxxxxx
果然,程序new出来的对象,每一分钟增长一次(对应每分钟循环一次)。

 

 

此时心中有一个大大的问号:  为什么GC没有回收掉?

如果GC回收了,TCP连接会Close吗? 带着这个疑问,用tcpdump监控下tcp连接。

 

jmap -histo:live 18041 |grep com.xxxxxx # live会引起GC:没有找到根据,但确实是这样。
 在GC的瞬间,tcpdump看到客户端发出的reset包,同时CLOSE_WAIT连接都消失了。 

 

 

15:27:50.152698 IP WOOS1.46262 > 137.32.25.62.talon-disc: R 1384067195:1384067195(0) ack 4094862191 win 72 <nop,nop,timestamp 536888568 1094736905>
15:27:50.152710 IP WOOS1.44490 > 137.32.25.62.talon-disc: R 1983758145:1983758145(0) ack 4199192243 win 72 <nop,nop,timestamp 536888568 1094821918>
15:27:50.152723 IP WOOS1.58174 > 137.32.25.62.talon-disc: R 1982916452:1982916452(0) ack 4178184596 win 72 <nop,nop,timestamp 536888568 1094806915>
15:27:50.152738 IP WOOS1.32940 > 137.32.25.62.talon-disc: R 1748662783:1748662783(0) ack 4206843128 win 72 <nop,nop,timestamp 536888568 1094826919>
15:27:50.152762 IP WOOS1.36913 > 137.32.25.62.talon-disc: R 815070216:815070216(0) ack 4200525319 win 72 <nop,nop,timestamp 536888568 1094826919>
15:27:50.152775 IP WOOS1.40743 > 137.32.25.62.talon-disc: R 4116878055:4116878055(0) ack 4209835792 win 72 <nop,nop,timestamp 536888568 1094836922>
15:27:50.152788 IP WOOS1.33267 > 137.32.25.62.talon-disc: R 2893572903:2893572903(0) ack 4218047967 win 72 <nop,nop,timestamp 536888568 1094841922>
15:27:50.152802 IP WOOS1.38644 > 137.32.25.62.talon-disc: R 1232744431:1232744431(0) ack 12002951 win 72 <nop,nop,timestamp 536888568 1094931936>
 
解决问题:
     既然GC可以关闭连接,只要能让jvm即时GC就可以解决问题。 考虑到程序时各种大量的List , Map的对象互相引用,是否是这个原因导致 不能及时GC?(这是工作以来,第一次遇到GC的问题,脑子里关于GC的知识太少)
    于是修改程序,在List , Map 超出作用域时,clear掉。 用jmap观察程序,对象不再无限制增长:增长到一定值后大减,被GC掉。同时连接数也不再无限制增长,最大到30左右连接就会被关闭掉。
教训:
代码中没有考虑GC效率问题,尤其是map,list对象很多,对象间引用关系复杂,导致GC无法及时回收过期对象。   对于java的GC策略也不了解。看来要花些时间了解GC了。
 
 
0
0
分享到:
评论

相关推荐

    axis2客户端调用axis1服务接口

    axis2客户端调用axis1服务接口 调用方式 使用RPC方式调用WebService,为了防止冲突可以增加 // 与weblogic的lib冲突配置 System.setProperty("javax.xml.stream.XMLInputFactory", ...

    axis2客户端调用服务端,带用户身份认证

    Axis2提供了一种高效、灵活且可扩展的方式来实现服务端和客户端的服务调用。当涉及到“axis2客户端调用服务端,带用户身份认证”时,我们主要关注的是如何在 Axis2 客户端中添加安全机制,确保只有经过验证的用户...

    axis2客户端调用带Ntlm认证例子

    以下是一个简单的Axis2客户端代码示例,演示如何在调用Web服务时使用NTLM认证: ```java import org.apache.axis2.AxisFault; import org.apache.axis2.client.Options; import org.apache.axis2.client.Service...

    axis2客户端调用webService接口,精简jar包

    总的来说,使用Axis2客户端调用WebService接口是一种常见的开发实践,通过精简jar包可以优化项目的体积,提高部署效率。理解这个过程并掌握如何精简jar包,对于任何涉及到Web服务的开发工作都是十分有益的。

    AXIS2作为客户端调用webService的demo

    用AXIS2作为客户端调用webService的demo:本人亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。

    axis2客户端调用工程代码

    在IT行业中,Axis2是Apache软件基金会开发的一个用于构建Web服务和SOAP客户端的强大框架。它基于 Axis1,并提供了许多改进和新特性,使得在Java环境中处理Web服务变得更加简单。本篇将详细介绍如何在Axis2环境下编写...

    AXIS2客户端调用实例

    总结来说,AXIS2客户端调用实例涵盖了从服务引用、配置到实际调用的全过程,涉及了AXIS2的核心组件和功能。理解和掌握这些知识点对于开发者在实际项目中使用AXIS2调用Web服务至关重要。通过实践和不断学习,开发者...

    AXIS1.4客户端调用

    5. **源码**:在处理AXIS1.4客户端调用时,开发者可能需要查看和理解生成的Java源码,以便定制和优化调用过程,例如添加自定义处理逻辑或错误处理。 6. **工具**:Apache Axis1.4提供了一系列工具,如wsdl2java、...

    Axis客户端调用代码

    在实际开发中,熟悉并熟练使用Axis客户端调用代码可以极大地提高开发效率,简化与Web服务的交互过程。 综上所述,了解和掌握Axis客户端调用代码对于开发基于SOAP的Web服务应用程序至关重要。通过WSDL2JAVA工具,...

    webservice-axis2客户端调用(多参).txt

    之前webservice客户端调用,使用RPC客戶端接口调用方法,但发现此种调用方式针对携参方式并不适用。最后经过多种方式测试选择了OMFactory......调用。经测试好用

    cxf客户端调用axis服务端流程

    Axis1.x版本是较老的实现,而Axis2是其后续版本,提供了更好的性能和模块化设计。 ### 二、CXF客户端调用Axis服务端步骤 #### 1. 获取服务端WSDL 首先,你需要获取Axis服务端的WSDL(Web Service Definition ...

    axis2客户端所需要的所有jar包

    本文将详细阐述Axis2客户端所需的所有jar包及其在调用服务端、测试接口过程中的作用。 首先,让我们了解什么是Axis2。Axis2是Apache软件基金会的一个开源项目,它提供了一个灵活、高性能的SOAP引擎,支持多种协议,...

    基于Axis的Web Service客户端调用

    下载并安装Apache Axis,然后使用-axis2/bin目录下的wsdl2java工具,将WSDL文件转换为Java客户端代码。命令格式如下: ``` wsdl2java -uri http://example.com/weather/WeatherWebService?wsdl ``` 这将生成一系列...

    axis客户端调用webservice

    java axis客户端调用webservice,可应用于ofbiz框架。 解决网络上共享代码两次调用后会出现timeout的BUG

    axis2客户端需要的jar包

    Axis2是Apache软件基金会开发的一款基于Java的Web服务框架,用于构建高效、灵活且可扩展的Web服务。在开发Axis2客户端时,正确地引入所需的jar包是至关重要的,因为这些库提供了与服务交互所需的各种功能。以下是...

    myService_purpose1sv_cxf调用axis2的接口服务_接口服务_

    在描述中,“用框架cxf调用axis2提供的接口服务的一个简单例子”,意味着我们将探讨一个简单的CXF客户端如何与Axis2服务端进行交互。这通常涉及到以下步骤: 1. **创建CXF客户端**:首先,我们需要创建一个CXF...

    axis2客户端调用webService的DEMO

    用AXIS2作为客户端调用webService的demo:亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。

    axis2生成客户端服务端代码

    ### Axis2生成客户端与服务端代码详解 #### 一、Axis2简介 Axis2是Apache组织下的一个开源项目,它是一种高性能、轻量级的Web服务框架,支持SOAP和REST等协议,能够帮助开发者轻松地构建和部署Web服务。Axis2提供了...

    cxf_axis_xfire客户端调用的几种方法[收集].pdf

    CXF、AXIS2、XFire是三种流行的Java Web服务框架,它们允许开发者创建和消费Web服务。在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会...

    WebService:Axis客户端调用需要身份验证的CXF服务

    当Axis客户端需要调用一个需要身份验证的CXF服务时,我们需要配置Axis客户端以正确地传递认证信息。以下是一些关键步骤: 1. **设置认证头**:对于基本或Digest认证, Axis客户端需要在HTTP请求中添加相应的...

Global site tag (gtag.js) - Google Analytics