JMX连接超时

3

我的线程池因为大部分线程在等待socket连接而变得满了。如何为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)

这不是https://dev59.com/CWcs5IYBdhLWcg3wgkQQ的重复吗? 除了连接超时和响应超时之外,区别可能在于其他方面都是相同的。 - bartosz.r
请添加相关的代码,这样我就可以查看解决方案。 - RRM
@bartosz.r 这不一样,看下面我的回答。RMI/JMX的读取超时是可配置的。TCP的连接超时则不行,不幸的是你需要深入Java的网络配置中去做这件事。 - drewboswell
2个回答

0
这是一个棘手的问题。这取决于由于您所处的环境而导致超时的哪个部分。
最有可能的是,由于防火墙问题或仍然存在其套接字的死应用程序,您遇到了TCP级别的连接超时。
JVM的总connecttimeout设置为-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

这将刺激一个已死的应用程序或防火墙端口被阻断。


-1
只需添加以下系统属性:“-Dsun.rmi.transport.tcp.responseTimeout=60000”

为什么这个答案被踩了?请看这个回答 - Lonzak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接