2016-05-29 5 views
0

クライアントでApache CXFがあります。java.net.SocketException: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 

私は次のコードで、プロキシクライアントを構築します。1回

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. この問題の解決方法を教えてください。

EDITED:

上記スニペットコードでは、私は、次のように、呼の方法のために、私は単にServiceインターフェースのメソッドを呼び出す、Serviceインターフェイスにクライアント・インスタンスを作成する:

proxyObject.notifyAccountStatement(acountNumber); 

Serviceインタフェースはインスタントで同時に呼び出されます(proxyObject

Apache CXFバージョンは次のとおりです。2.3.3

+0

例外がクライアント上にあります。開いているファイルが多すぎると、開いている接続が多すぎるということです。すべての接続をクローズしていることを確認してください。 – pedrofb

+0

@pedrofb 'Apache CXF'のクローズ接続の方法は? – MJM

+0

基本的に応答を消費します。 WebClientはあなたのためにそれを行います。 Webサービスを呼び出すクライアントコードを含めて、CXFのバージョンを示してください – pedrofb

答えて

0

私はLinuxでの同様の問題を持っています。 Linuxでは、開いている接続(ソケット)の数は、開いているファイルのシステム制限によって制限されます。 詳細 - https://unix.stackexchange.com/questions/157351/why-are-tcp-ip-sockets-considered-open-files

問題を解決するには、コマンド "ulimit -n XXXXX"を使用してオープンファイルのシステム制限を増やしてください。例えば

[[email protected] ~]$ ulimit -n #default value. so few. 
1024 

修正:

[[email protected] ~]$ sudo sh -c "ulimit -n 65535 && exec su $LOGNAME" 
[[email protected] ~]$ ulimit -n 
65535 
+0

これは問題を解決するものではありません。基本的にオープンソケットを永久に保ち、問題を遅らせるだけです。 –

関連する問題