有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

web服务java。网SocketException:cxf中打开的文件太多

我有一个soapApache CXF客户端

有时,当我想连接到服务器时,我会发现一个异常:

javax.xml.ws.WebServiceException: Could not send Message.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135) ~[cxf-rt-frontend-jaxws-2.3.3.jar:2.3.3]
    at $Proxy81.transferFunds(Unknown Source) ~[na:na]
Caused by: java.net.SocketException: SocketException invoking http://10.20.112.30:40001/Service/JJMService?wsdl: Too many open files
    at sun.reflect.GeneratedConstructorAccessor418.newInstance(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_05]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) ~[na:1.7.0_05]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:2107) ~[cxf-rt-transports-http-2.3.3.jar:2.3.3]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2092) ~[cxf-rt-transports-http-2.3.3.jar:2.3.3]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-rt-core-2.3.3.jar:2.3.3]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:697) ~[cxf-rt-transports-http-2.3.3.jar:2.3.3]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-rt-core-2.3.3.jar:2.3.3]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) ~[cxf-api-2.3.3.jar:2.3.3]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516) ~[cxf-rt-core-2.3.3.jar:2.3.3]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313) ~[cxf-rt-core-2.3.3.jar:2.3.3]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265) ~[cxf-rt-core-2.3.3.jar:2.3.3]
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) ~[cxf-rt-frontend-simple-2.3.3.jar:2.3.3]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124) ~[cxf-rt-frontend-jaxws-2.3.3.jar:2.3.3]
    ... 36 common frames omitted
Caused by: java.net.SocketException: Too many open files
    at java.net.Socket.createImpl(Socket.java:447) ~[na:1.7.0_05]
    at java.net.Socket.connect(Socket.java:577) ~[na:1.7.0_05]
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175) ~[na:1.7.0_05]
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:378) ~[na:1.7.0_05]
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:473) ~[na:1.7.0_05]
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:203) ~[na:1.7.0_05]
    at sun.net.www.http.HttpClient.New(HttpClient.java:290) ~[na:1.7.0_05]
    at sun.net.www.http.HttpClient.New(HttpClient.java:306) ~[na:1.7.0_05]
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:995) ~[na:1.7.0_05]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:931) ~[na:1.7.0_05]
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:849) ~[na:1.7.0_05]
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1090) ~[na:1.7.0_05]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:2003) ~[cxf-rt-transports-http-2.3.3.jar:2.3.3]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1955) ~[cxf-rt-transports-http-2.3.3.jar:2.3.3]
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42) ~[cxf-api-2.3.3.jar:2.3.3]
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) ~[cxf-api-2.3.3.jar:2.3.3]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2023) ~[cxf-rt-transports-http-2.3.3.jar:2.3.3]
    ... 45 common frames omitted

我通过以下代码构造代理客户端:

org.apache.cxf.jaxws.JaxWsProxyFactoryBean factoryBean = new org.apache.cxf.jaxws.JaxWsProxyFactoryBean();
factoryBean.setAddress("http://10.20.112.30:40001/Service/JJMService?wsdl");
factoryBean.setServiceClass(Service.class);
Service proxyObject = (Service) factoryBean.create();
HTTPConduit httpConduit = (HTTPConduit)ClientProxy.getClient(proxyObject).getConduit();
httpConduit.getClient().setConnectionTimeout(5000);
httpConduit.getClient().setReceiveTimeout(5000);

这个代码调用一次,意味着proxyObject是单例的

我有两个问题:

  1. 上述异常发生在服务器还是我的客户端
  2. 这个问题的解决方案是什么

编辑:

通过上面的代码片段,我创建了一个Service接口的客户机实例,然后对于调用方法,我只调用Service接口方法,如下所示:

proxyObject.notifyAccountStatement(acountNumber);

注意调用Service接口是在实例(proxyObject

我的Apache CXF版本是:2.3.3


共 (0) 个答案