webservice客户端调用端口不释放,状态为CLOSE_WAIT

xcs841202 2009-12-29 10:42:02
最近根据WSDL生成一个客户端,遇到个极其郁闷的问题,程序不出错,调用也正常,但是客户端端口却无法释放,状态一直为close_wait;具体情况如下:
自动生成的客户端代码:

package com.eii.webservices.user;

import java.net.MalformedURLException;
import java.util.Collection;
import java.util.HashMap;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.aegis.AegisBindingProvider;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;
import org.codehaus.xfire.service.Endpoint;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.soap.AbstractSoapBinding;
import org.codehaus.xfire.transport.TransportManager;

public class GetUserInfoClient {

private static XFireProxyFactory proxyFactory = new XFireProxyFactory();
private HashMap endpoints = new HashMap();
private Service service0;

public GetUserInfoClient() {
create0();
Endpoint GetUserInfoHttpPortEP = service0 .addEndpoint(new QName("http://eii.com/webservices/user", "GetUserInfoHttpPort"), new QName("http://eii.com/webservices/user", "GetUserInfoHttpBinding"), "http://10.60.108.150:9080/EII/services/GetUserInfo");
endpoints.put(new QName("http://eii.com/webservices/user", "GetUserInfoHttpPort"), GetUserInfoHttpPortEP);
Endpoint GetUserInfoPortTypeLocalEndpointEP = service0 .addEndpoint(new QName("http://eii.com/webservices/user", "GetUserInfoPortTypeLocalEndpoint"), new QName("http://eii.com/webservices/user", "GetUserInfoPortTypeLocalBinding"), "xfire.local://GetUserInfo");
endpoints.put(new QName("http://eii.com/webservices/user", "GetUserInfoPortTypeLocalEndpoint"), GetUserInfoPortTypeLocalEndpointEP);
}

public Object getEndpoint(Endpoint endpoint) {
try {
return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
} catch (MalformedURLException e) {
throw new XFireRuntimeException("Invalid URL", e);
}
}

public Object getEndpoint(QName name) {
Endpoint endpoint = ((Endpoint) endpoints.get((name)));
if ((endpoint) == null) {
throw new IllegalStateException("No such endpoint!");
}
return getEndpoint((endpoint));
}

public Collection getEndpoints() {
return endpoints.values();
}

private void create0() {
TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
HashMap props = new HashMap();
props.put("annotations.allow.interface", true);
AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry()));
asf.setBindingCreationEnabled(false);
service0 = asf.create((com.eii.webservices.user.GetUserInfoPortType.class), props);
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://eii.com/webservices/user", "GetUserInfoHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
}
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://eii.com/webservices/user", "GetUserInfoPortTypeLocalBinding"), "urn:xfire:transport:local");
}
}

public GetUserInfoPortType getGetUserInfoHttpPort() {
return ((GetUserInfoPortType)(this).getEndpoint(new QName("http://eii.com/webservices/user", "GetUserInfoHttpPort")));
}

public GetUserInfoPortType getGetUserInfoHttpPort(String url) {
GetUserInfoPortType var = getGetUserInfoHttpPort();
org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
return var;
}

public GetUserInfoPortType getGetUserInfoPortTypeLocalEndpoint() {
return ((GetUserInfoPortType)(this).getEndpoint(new QName("http://eii.com/webservices/user", "GetUserInfoPortTypeLocalEndpoint")));
}

public GetUserInfoPortType getGetUserInfoPortTypeLocalEndpoint(String url) {
GetUserInfoPortType var = getGetUserInfoPortTypeLocalEndpoint();
org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
return var;
}

public static void main(String[] args) {
//以下是测试代码
String [] sss ={"A0071142","A0070549","A0071023","A0070580","A0070646","A0081084","A0070609","A0070452"};
for(int i=0;i<sss.length;i++){
String tt=sss[i];
GetUserInfoClient client = new GetUserInfoClient();

//create a default service endpoint
GetUserInfoPortType service = client.getGetUserInfoHttpPort();

ObjectFactory obj = new ObjectFactory();
GetUserArgs bean = new GetUserArgs();
JAXBElement<String> code = obj.createGetUserArgsUserId(tt);
JAXBElement<String> id = obj.createGetUserArgsSysCode("EII");
bean.setUserId(id);
bean.setSysCode(code);

String ss= service.getUser(bean);
//System.out.println(i+" :"+ss);
org.codehaus.xfire.client.Client.getInstance(service).close();
System.out.println(i+" :"+ss);

//System.out.println("test client completed");
// System.exit(0);
}
}

}
直接run此程序时,一起正常,查看服务器端口,调用结束后也都关闭连接了,本地端口处于wait_time状态,过段时间后也可以自动收回。但是我将main方法中的测试代码放在servlet中通过web工程调用时,却是另一种情况:servlet执行完之后,调用结果均正常,通过netstat -a查看本地端口时,发现几次调用本地端口为close_wait,服务器端9080端口有一个状态为FIN_WAIT_2的。
close_wait状态的端口一直占用着,时间长了对系统资源耗费较大!只有关闭应用之后才会消失!
请高手指点下这种问题如何出现的,该如何解决?
...全文
849 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wholesale3151 2010-01-05
  • 打赏
  • 举报
回复
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import org.codehaus.xfire.chinese wholesalers;
import org.codehaus.xfire.aegis.AegisBindingProvider;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.client.XFireProxyFactory;

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧