背景: 程序使用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了。
相关推荐
axis2客户端调用axis1服务接口 调用方式 使用RPC方式调用WebService,为了防止冲突可以增加 // 与weblogic的lib冲突配置 System.setProperty("javax.xml.stream.XMLInputFactory", ...
Axis2提供了一种高效、灵活且可扩展的方式来实现服务端和客户端的服务调用。当涉及到“axis2客户端调用服务端,带用户身份认证”时,我们主要关注的是如何在 Axis2 客户端中添加安全机制,确保只有经过验证的用户...
以下是一个简单的Axis2客户端代码示例,演示如何在调用Web服务时使用NTLM认证: ```java import org.apache.axis2.AxisFault; import org.apache.axis2.client.Options; import org.apache.axis2.client.Service...
总的来说,使用Axis2客户端调用WebService接口是一种常见的开发实践,通过精简jar包可以优化项目的体积,提高部署效率。理解这个过程并掌握如何精简jar包,对于任何涉及到Web服务的开发工作都是十分有益的。
用AXIS2作为客户端调用webService的demo:本人亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
在IT行业中,Axis2是Apache软件基金会开发的一个用于构建Web服务和SOAP客户端的强大框架。它基于 Axis1,并提供了许多改进和新特性,使得在Java环境中处理Web服务变得更加简单。本篇将详细介绍如何在Axis2环境下编写...
总结来说,AXIS2客户端调用实例涵盖了从服务引用、配置到实际调用的全过程,涉及了AXIS2的核心组件和功能。理解和掌握这些知识点对于开发者在实际项目中使用AXIS2调用Web服务至关重要。通过实践和不断学习,开发者...
5. **源码**:在处理AXIS1.4客户端调用时,开发者可能需要查看和理解生成的Java源码,以便定制和优化调用过程,例如添加自定义处理逻辑或错误处理。 6. **工具**:Apache Axis1.4提供了一系列工具,如wsdl2java、...
在实际开发中,熟悉并熟练使用Axis客户端调用代码可以极大地提高开发效率,简化与Web服务的交互过程。 综上所述,了解和掌握Axis客户端调用代码对于开发基于SOAP的Web服务应用程序至关重要。通过WSDL2JAVA工具,...
之前webservice客户端调用,使用RPC客戶端接口调用方法,但发现此种调用方式针对携参方式并不适用。最后经过多种方式测试选择了OMFactory......调用。经测试好用
Axis1.x版本是较老的实现,而Axis2是其后续版本,提供了更好的性能和模块化设计。 ### 二、CXF客户端调用Axis服务端步骤 #### 1. 获取服务端WSDL 首先,你需要获取Axis服务端的WSDL(Web Service Definition ...
本文将详细阐述Axis2客户端所需的所有jar包及其在调用服务端、测试接口过程中的作用。 首先,让我们了解什么是Axis2。Axis2是Apache软件基金会的一个开源项目,它提供了一个灵活、高性能的SOAP引擎,支持多种协议,...
下载并安装Apache Axis,然后使用-axis2/bin目录下的wsdl2java工具,将WSDL文件转换为Java客户端代码。命令格式如下: ``` wsdl2java -uri http://example.com/weather/WeatherWebService?wsdl ``` 这将生成一系列...
java axis客户端调用webservice,可应用于ofbiz框架。 解决网络上共享代码两次调用后会出现timeout的BUG
Axis2是Apache软件基金会开发的一款基于Java的Web服务框架,用于构建高效、灵活且可扩展的Web服务。在开发Axis2客户端时,正确地引入所需的jar包是至关重要的,因为这些库提供了与服务交互所需的各种功能。以下是...
在描述中,“用框架cxf调用axis2提供的接口服务的一个简单例子”,意味着我们将探讨一个简单的CXF客户端如何与Axis2服务端进行交互。这通常涉及到以下步骤: 1. **创建CXF客户端**:首先,我们需要创建一个CXF...
用AXIS2作为客户端调用webService的demo:亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
### Axis2生成客户端与服务端代码详解 #### 一、Axis2简介 Axis2是Apache组织下的一个开源项目,它是一种高性能、轻量级的Web服务框架,支持SOAP和REST等协议,能够帮助开发者轻松地构建和部署Web服务。Axis2提供了...
CXF、AXIS2、XFire是三种流行的Java Web服务框架,它们允许开发者创建和消费Web服务。在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会...
当Axis客户端需要调用一个需要身份验证的CXF服务时,我们需要配置Axis客户端以正确地传递认证信息。以下是一些关键步骤: 1. **设置认证头**:对于基本或Digest认证, Axis客户端需要在HTTP请求中添加相应的...