WebService CXF 客户端连接发送数据时报错

fantianfanxing 2014-06-19 03:50:41
大家好,
我先介绍一下情况:
我使用cxf做了一个webservice的服务端,然后写一个client端 java 调用这个webservice服务,然后循环100W次,向服务端发送数据,在webservice服务端启动之后, 调用client端, 一般可以调用2,3次。就是说,可以发送200W的数据,之后第3次调用的时候,client运行期间就会卡住,然后报错。
注:并不是以开始的时候连接报错,是client运行期间报的错误。


客户端运行报错:
2014-6-19 10:40:35 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://webservice.coreware.com/}IFlumeServiceService from class com.coreware.webservice.IFlumeService
1394 82590
5627 253980
8954 199620
17298 507939
25759 516121
31766 366427
44235 760609
47544 201849
54259 409615
62720 516121
66951 258091
83873 1032242

2014-6-19 10:41:48 org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
警告: Interceptor for {http://webservice.coreware.com/}IFlumeServiceService#{http://webservice.coreware.com/}sendMsg has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
at $Proxy39.sendMsg(Unknown Source)
at com.coreware.webClient.FlumeClient.send(FlumeClient.java:42)
at com.coreware.webClient.FlumeClient.main(FlumeClient.java:63)
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:8888/FlumeWebService/flumeService: Read timed out
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1347)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1331)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
... 10 more
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1064)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1543)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1513)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1318)
... 13 more
Exception in thread "main" javax.xml.ws.WebServiceException: Could not send Message.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
at $Proxy39.sendMsg(Unknown Source)
at com.coreware.webClient.FlumeClient.send(FlumeClient.java:42)
at com.coreware.webClient.FlumeClient.main(FlumeClient.java:63)
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:8888/FlumeWebService/flumeService: Read timed out
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1347)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1331)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage



1.1 Server端 的spring-cxf.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd">

<!--CXF配置-->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>


<jaxws:endpoint id="flumeService" implementor="com.coreware.webservice.FlumeService"
address="/flumeService" />

<jaxws:client id="flumeClient" address="http://localhost:8888/FlumeWebService/flumeService"
serviceClass="com.coreware.webservice.IFlumeService" />

</beans>
1.2 Server端接口:
package com.coreware.webservice;

import javax.jws.WebService;

@WebService
public interface IFlumeService {

public void sendMsg(String msg);

}

1.3 Server端接口实现类:
package com.coreware.webservice;

import javax.jws.WebService;

import com.coreware.flume.rpcinterfaceImpl.Quene;

@WebService(endpointInterface = "com.coreware.webservice.IFlumeService")
public class FlumeService implements IFlumeService {


private static Quene offerQuene = Quene.newInstance();
@Override
public void sendMsg(String msg){
//offerQuene.offerQue(msg);
System.out.println(msg);
}

}

2.1Client调用代码:
package com.coreware.webClient;

public class FlumeClient {

static IFlumeService service=null;
static{
//Spring调用
//ApplicationContext context = new ClassPathXmlApplicationContext("spring-cxf.xml");
//IFlumeService client=(IFlumeService)context.getBean("flumeClient");
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(IFlumeService.class);
factory.setAddress("http://localhost:8888/FlumeWebService/flumeService");
service = (IFlumeService)factory.create();
/*ClientProxy proxy = (ClientProxy) Proxy.getInvocationHandler(service);
Client client = proxy.getClient();
HTTPConduit http = (HTTPConduit) client.getConduit();
http.getClient().setReceiveTimeout(0);
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(60000);// 连接超时(毫秒)
httpClientPolicy.setAllowChunking(false);// 取消块编码
httpClientPolicy.setReceiveTimeout(30000);// 响应超时(毫秒)*/

}

private static void init(){

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(IFlumeService.class);
factory.setAddress("http://localhost:8888/FlumeWebService/flumeService");
service = (IFlumeService)factory.create();
}

public static void send(String msg){
if(service == null){
System.out.println("+++++++++++++++++++++");
init();
}
service.sendMsg(msg);
}

public static void main(String[] args){

Date s1 = new Date();
StringBuilder sb = new StringBuilder();
int bufferTime = 20;
int strMaxLeth = 1000000;
long lastSend = System.currentTimeMillis();
boolean send = false;

for(int i = 0; i<1000000; i++){
sb.append("int statusCode = httpClient.executeMethod(postMethod)= "+ i + "\n");
if(!send){
if(System.currentTimeMillis() - lastSend >= bufferTime || sb.length()>strMaxLeth){
send = true;
}
}
if(send && sb != null){
send = false;
FlumeClient.send(sb.toString());
lastSend = System.currentTimeMillis();
System.out.println(i+ " "+ sb.length());
sb.delete(0, sb.length());
}
}

if( sb != null){
send = false;
FlumeClient.send(sb.toString());
sb.delete(0, sb.length());
}
Date e1 = new Date();
System.out.println((e1.getTime()-s1.getTime())+"ms");

}

}



...全文
702 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fantianfanxing 2014-06-20
  • 打赏
  • 举报
回复
怎么没有高手回复,自己顶。。
fantianfanxing 2014-06-20
  • 打赏
  • 举报
回复
原因是server端的响应超时了, server端的报错如下: 警告: An exception was thrown by an exception handler. org.jboss.netty.channel.ChannelException: Failed to create a selector. at org.jboss.netty.channel.socket.nio.AbstractNioWorker.start(AbstractNioWorker.java:154) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.executeInIoThread(AbstractNioWorker.java:306) at org.jboss.netty.channel.socket.nio.NioWorker.executeInIoThread(NioWorker.java:38) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.executeInIoThread(AbstractNioWorker.java:290) at org.jboss.netty.channel.socket.nio.NioWorker.executeInIoThread(NioWorker.java:38) at org.jboss.netty.channel.socket.nio.AbstractNioChannelSink.execute(AbstractNioChannelSink.java:34) at org.jboss.netty.channel.Channels.fireExceptionCaughtLater(Channels.java:504) at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:47) at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:55) at org.jboss.netty.channel.Channels.close(Channels.java:821) at org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java:194) at org.jboss.netty.channel.ChannelFutureListener$2.operationComplete(ChannelFutureListener.java:52) at org.jboss.netty.channel.DefaultChannelFuture.notifyListener(DefaultChannelFuture.java:399) at org.jboss.netty.channel.DefaultChannelFuture.notifyListeners(DefaultChannelFuture.java:385) at org.jboss.netty.channel.DefaultChannelFuture.setFailure(DefaultChannelFuture.java:352) at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink$Boss.connect(NioClientSocketPipelineSink.java:401) at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink$Boss.processSelectedKeys(NioClientSocketPipelineSink.java:358) at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink$Boss.run(NioClientSocketPipelineSink.java:274) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Caused by: java.io.IOException: Unable to establish loopback connection at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106) at java.security.AccessController.doPrivileged(Native Method) at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122) at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:27) at java.nio.channels.Pipe.open(Pipe.java:133) at sun.nio.ch.WindowsSelectorImpl.<init>(WindowsSelectorImpl.java:105) at sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvider.java:26) at java.nio.channels.Selector.open(Selector.java:209) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.start(AbstractNioWorker.java:152) ... 20 more Caused by: java.nio.channels.ClosedByInterruptException at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184) at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:518) at java.nio.channels.SocketChannel.open(SocketChannel.java:146) at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:78) ... 28 more

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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