客户端伪代码如下
//主线程方法
while(true){
test.TestGetServiceStatus();//客户端连接服务端的测试方法
try{
Thread.sleep(23 * 1000);//每隔23秒执行下webservice客户端方法
}catch(Exception e){
e.printStackTrace();
}
}
private String wsUrl = "http://127.0.0.1:8080/axis2/services/webservice/";
public void TestGetServiceStatus(){
WebserviceStub stub = null;
try{
stub = new WebserviceStub(wsUrl);//实例华客户端
System.out.println("new a stub");
Thread.sleep(5000);//5秒钟后执行客户端向服务端的请求
String result = stub.queryServiceStatus(request).getResult();//请求服务端
System.out.println("result: " + result);
//清除客户端
stub._getServiceClient().cleanupTransport();
stub._getServiceClient().cleanup();
stub.cleanup();
stub = null;
}catch(Exception e){
}
}
步骤解释:
1、主线程每隔23秒调用方法,来实现客户端对服务端的调用
2、客户端在对服务段进行借口调用时:
2.1、实例化客户端对象
2.2、睡5秒钟
2.3、调用服务端接口,得到结果
2.4、清除客户端
3、服务端的相应接口,收到请求后,睡眠25秒,给出结果。
4、webservice服务端配置文件里,加入连接的存活时间,为20s,如下(axis2.xml):
<transportReceiver name="http"
class="org.apache.axis2.transport.http.SimpleHTTPServer">
<parameter name="port">8080</parameter>
<parameter name="threadKeepAliveTime">20</parameter>
</transportReceiver>
基于以上的调用,用ethereal抓包得到下图:
注意两个绿色框的内容,详细过程分析如下:
1、new stub的时候,客户端与服务端并没有连接;
2、5秒钟后,客户端向服务端发送请求,连接建立,如图的1—7个数据包;
3、测试客户端做出处理,即睡眠25秒,之后返回数据,如图的8—23个数据包;
4、客户端收到数据后,cleanup,方法退出,但是此时看到连接并没有关闭;
5、服务端在20秒后(设置的连接存活时间),断开连接,如图的24,25个数据包;
6、由于客户端这边在25秒的时候(23个数据包所示)退出了方法,过23秒后重新调用测试方法,于是应该在48秒的时候,重新new stub,这个时候,看图知道,在第26个数据包的时候(也就是48秒的时候)客户端发出了先前连接的断开包,至此前一个连接完全释放,开始下一轮的连接循环。
由此可以得出:
1、客户端new stub的时候,并没有与服务端建立连接,而只是释放之前的连接;
2、连接是由服务端先发起的;
3、客户端发送服务端请求的时候,连接由客户端发起,并建立;
由上面的结论可以分析出一个问题:客户端在调用服务端接口方法,并退出后,连接还存在,直到连接存活时间达到服务端设置的连接存活时间后,才被服务端所关闭,这个时候,如果客户端不再重新发起请求,或者客户端出错(内存溢出,无法new stub等),那么之前的那个连接就一直会处在close_wait状态,而无法清除。这就是为什么有些webservice客户端这边,跑了一段时间后,会出现很多close_wait状态的连接的缘故。
再来看,是什么原因导致了new stub的时候出错的呢?上面也讲到了,虽然可能性有很多,但是有一个却是大家经常犯的,那就是客户端这边内存溢出了。
很多webservice客户端,在跑了很长时间后,发现内存就不够用了,抛出java heap space的错误,随之而来的就是类似Read Timeout阿等错误,这样close_wait就越来越多,这些错误也会越抛越多……直到整个客户端都无法与服务端取得任何连接,而进入“假死”状态。那么如何避免客户端内存持续走高呢?
通过jdk自带的jconsole和eclipse提供的memory analyzer可以看到,客户端这边的内存在不断上升,java的gc根本无法释放使用过的内存,而通过memory analyzer可以看到,很多堆内存都在客户端调用服务端的方法里,无法释放(图就不上了)。也就是说,这不是我们实现某功能时自己的原因导致的内存溢出,而是axis2本身的内存溢出。那是不是就没有办法解决了呢?不是的!
细心的你有没有注意到开篇的时候我提供的客户端的伪代码?里面有四句:
stub._getServiceClient().cleanupTransport();
stub._getServiceClient().cleanup();
stub.cleanup();
stub = null;
当时加这四句代码,只是为了验证客户端时候能把连接主动关闭,可是结果是否定的,但是,恰好是这几句解决了内存溢出的问题!只要在每次客户端调用后,都执行以上四句代码,那么客户端new出来的堆内存资源就可以被java的gc所回收掉了。
- 浏览: 277864 次
- 性别:
- 来自: 北京
最新评论
-
somefuture:
为何有文章说asyncAppdender不支持J2ee容器ht ...
log4j 日志异步化AsyncAppender 大幅提升系统性能 -
model2012:
你用adt跑的吧,android里面是不能直接运行main方法 ...
JVM崩溃:Current thread JavaThread "CompilerThread1" daemon [_thre -
di1984HIT:
不错。学习了啊
.rmi.ConnectException: Connection refused to host: 127.0.0.1来龙去脉 -
gygwoaini:
还有可能是第3个问号没给值
索引中丢失 IN 或 OUT 参数:: 3 -
fool2011:
多谢
索引中丢失 IN 或 OUT 参数:: 3
相关推荐
标题中的“Axis2_Service_Archiver_1.3.0”指的是一个针对MyEclipse集成开发环境的Axis2 Web服务插件,版本为1.3.0。这个插件是Axis2框架的一部分,用于简化在MyEclipse中创建、部署和管理Axis2 Web服务的过程。 ...
标题中的“axis2 webservice for myeclipse插件Axis2_Codegen_Wizard_1.2.1”是指一个专门用于MyEclipse集成开发环境的Axis2 Web服务生成向导插件,版本为1.2.1。这个插件极大地简化了在MyEclipse中创建和操作Axis2 ...
标题中的“axis2webservice接口例子”指的是使用Apache Axis2框架创建的一个Web服务接口实例。Apache Axis2是Java平台上的一款强大的Web服务开发工具,它提供了高效、灵活且可扩展的环境来构建和部署Web服务。这个...
1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web服务接口。这个类通常会遵循SOAP协议,定义服务操作。例如,你可以创建一个名为`HelloWorldService`的类,包含一个`sayHello`...
在描述中提到的“axis1生成java webservice客户端代码”,意味着这个压缩包可能包含用于生成 Java Web Service 客户端代码的工具。Axis1 提供了一个 wsdl2java 工具,可以将 WSDL(Web Service Description Language...
Axis2 WebService是一个开源的、基于Java的Web服务框架,由Apache软件基金会开发。它提供了构建和部署Web服务以及处理SOAP消息的强大工具。这个源码包可能是为了帮助开发者深入理解Axis2的工作原理,或者用于自定义...
Axis2_WebService_开发指南详细介绍了如何使用Axis2开发WebService。 首先,在进行Axis2的准备工作时,需要下载Axis2的相关jar包,这些依赖包可以在Axis2的官方网站上找到。截至文档提供的信息,最新的版本是1.5.4...
"java_webservice"表示Web Service是用Java编写的,可能使用了诸如Axis2、JAX-WS等Java Web Service框架。"sgip"通常是指Short Message Gateway Interface Protocol,即短信网关协议,可能在这个Web Service中用于...
本文将详细介绍"Axis2_Codegen_Wizard_1.3"和"Axis2_Service_Archiver_1.3"这两个工具在Axis2开发中的应用。 **Axis2_Codegen_Wizard_1.3** 是一个非常实用的代码生成向导,它极大地简化了基于Axis2的Web服务开发...
【使用Axis2搭建WebService】是关于在Java环境中利用Apache Axis2框架创建Web服务的过程。Apache Axis2是一个流行的Web服务引擎,用于构建和部署SOAP(简单对象访问协议)和RESTful Web服务。 首先,搭建环境是关键...
在实际应用中,开发人员会使用Axis提供的工具(如`wsdl2java`)将WSDL文件转换为Java源代码,然后在项目中引用这些生成的类来调用Web服务。这些类通常实现了Web服务的所有操作,并处理了与服务之间的通信细节,如...
AXIS2远程调用WebService是Java开发者在进行分布式服务交互时常用的一种技术。本文将详细介绍如何使用Eclipse集成开发环境和AXIS2框架创建并调用WebService。首先,我们需要准备以下基础工具: 1. Eclipse IDE:这...
Java Axis2 WebService 实现详解 在Java世界中,创建和使用Web服务是一个常见的任务,而Axis2是Apache软件基金会开发的一个高效的Web服务框架。它提供了丰富的功能,使得开发、部署和管理Web服务变得简单易行。本篇...
【标题】中的“基于axis2实现的webservice简单实现(客户端+服务端)”表明了本文将探讨如何使用Apache Axis2框架来创建和消费Web服务。Apache Axis2是Apache软件基金会开发的一个Web服务引擎,它提供了高效且灵活的...
在这个场景中,我们关注的是如何使用Apache CXF框架来调用由Axis2提供的接口服务。Apache CXF和Axis2都是流行的开放源码服务框架,它们各自在Web服务领域有着广泛的应用。 Apache CXF是一个强大的服务框架,它允许...
标题中的“axis2+spring webservice”指的是使用Apache Axis2框架与Spring框架集成来开发Web服务。Apache Axis2是Java环境中广泛使用的Web服务引擎,它提供了高性能、灵活且可扩展的架构。Spring框架则是一个全面的...
标题“Java-tomcat-axis2开发webservice返回json数据”涉及的是使用Java、Tomcat服务器以及Axis2框架来创建Web服务,并返回JSON格式的数据。这是一个常见的技术组合,用于构建RESTful API或者提供服务化接口。下面...