2013-08-28 166 views
3

我的線程池變滿了,因爲大多數線程正在等待套接字連接。如何添加超時JMX連接JMX連接超時

java.lang.Thread.State: RUNNABLE 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    - locked <0x05671ad0> (a java.net.SocksSocketImpl) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
    at java.net.Socket.connect(Socket.java:519) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:548) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:351) 
    at com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:71) 
    at javax.rmi.ssl.SslRMIClientSocketFactory.createSocket(SslRMIClientSocketFactory.java:105) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) 
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:97) 
    at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:185) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1871) 
    at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1841) 
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:257) 
+0

是不是http://stackoverflow.com/questions/12791025/how-to-set-request-timeout-for-jmx-connector/的重複。區別可能在於連接與響應超時,但其他情況相同。 –

+0

請添加代碼的相關部分,以便我可以查看解決方案。 – RRM

+0

@ bartosz.r它不一樣,請參閱下面的答案。讀超時可配置爲rmi/jmx。 TCP的連接超時不是,你需要在java的網絡配置中進行更深入的操作,這很不幸。 – drewboswell

回答

-2

只需添加下面的系統屬性 - 「-Dsun.rmi.transport.tcp.responseTimeout = 60000」

0

這是一個艱難的一個。這取決於由於您處於的環境而導致哪部分超時。

由於防火牆問題或其套接字仍在運行中的應用程序死鎖,您可能正在遇到TCP級別的連接超時。

JVM的整體連接超時設置爲-1,默認情況下無限。你好線程泄漏。

sun.net.client.defaultConnectTimeout (default: -1) 

你可以從這裏找到Java的Oracle網絡參數的文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html

的JMX/RMI具體文件可悲的是沒有一個連接超時在該水平設置。但是,他們對讀時間了一堆其他控件:https://docs.oracle.com/javase/8/docs/technotes/guides/rmi/sunrmiproperties.html

您可以測試此同時用與使用的netcat,並在指向您的應用程序到本地主機端口一樣簡單開發:

# creat socket on port 3333 
netcat -l 3333 
# now point your app on the socket 
# and you should be able to reproduce 

這將刺激端口上的應用程序或防火牆阻塞。