【问题标题】:Java execution in command line fails on JMX error命令行中的 Java 执行因 JMX 错误而失败
【发布时间】:2020-07-06 12:56:55
【问题描述】:

我们在 EKS 中运行的应用程序在尝试与 Jconsole 连接时抱怨“地址已在使用中”。当我们尝试仅运行 java -version 时,它会因相同的错误而失败。请参阅下面的异常:

/home/app # java -version
Error: JMX connector server communication error: service:jmx:rmi://qa-my-app-av22b3dcbc-4322t:9110
sun.management.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 9110; nested exception is: 
        java.net.BindException: Address already in use (Bind failed)
        at sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:800)
        at sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:468)
        at sun.management.Agent.startAgent(Agent.java:262)
        at sun.management.Agent.startAgent(Agent.java:452)
        at java.lang.System.startSNMPAgent(Native Method)
        at java.lang.Thread.completeInitialization(Thread.java:168)
        at java.lang.J9VMInternals.completeInitialization(J9VMInternals.java:74)
Caused by: java.rmi.server.ExportException: Port already in use: 9110; nested exception is: 
        java.net.BindException: Address already in use (Bind failed)
        at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:346)
        at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:254)
        at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:411)
        at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
        at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:237)
        at sun.management.jmxremote.ConnectorBootstrap$PermanentExporter.exportObject(ConnectorBootstrap.java:199)
        at javax.management.remote.rmi.RMIJRMPServerImpl.export(RMIJRMPServerImpl.java:146)
        at javax.management.remote.rmi.RMIJRMPServerImpl.export(RMIJRMPServerImpl.java:122)
        at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:404)
        at sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:796)
        ... 6 more
Caused by: java.net.BindException: Address already in use (Bind failed)
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
        at java.net.ServerSocket.bind(ServerSocket.java:390)
        at java.net.ServerSocket.<init>(ServerSocket.java:252)
        at java.net.ServerSocket.<init>(ServerSocket.java:143)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(RMIDirectSocketFactory.java:45)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(RMIMasterSocketFactory.java:345)
        at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:666)
        at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335)
        ... 15 more
Exception in thread "main" java/lang/RuntimeException: sun.management.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 9110; nested exception is: 
        java.net.BindException: Address already in use (Bind failed)
        at sun/management/Agent.error (Agent.java:526)
        at sun/management/Agent.startAgent (Agent.java:269)
        at sun/management/Agent.startAgent (Agent.java:452)
        at java/lang/System.startSNMPAgent (NativeMethod:4294967295)
        at java/lang/Thread.completeInitialization (Thread.java:168)
        at java/lang/J9VMInternals.completeInitialization (J9VMInternals.java:74)

JAVA_TOOL_OPTIONS 环境变量值:

-Dspring.config.location=/home/app/config/application.properties -Dlogging.config=/home/app/config/logback.xml -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=9110 -Dcom.sun.management.jmxremote.rmi.port=9110 -Djava.rmi.server.hostname=127.0.0.1 -javaagent:/home/app/newrelic/newrelic.jar -Dnewrelic.config.file=/home/app/newrelic/config/newrelic.yml

图像入口点很简单 ENTRYPOINT ["java", "-jar", "/home/app/application.jar"]

【问题讨论】:

    标签: java docker kubernetes jmx amazon-eks


    【解决方案1】:

    似乎该端口上有另一个进程。如果不是重要的,就杀死进程bia fuser,例如:

    sudo fuser -k 9110/tcp
    

    您还可以在杀死它之前检查那里正在收听的内容:

    lsof -i :9110
    

    当端口干净后,再试一次。另一种选择是将 rmi 端口号更改为不同于 9110 的值,因为 jmx 不需要特定的端口号即可工作(不要忘记更改端点上的端口)。

    【讨论】:

    • 知道了,问题是我们的 JAVA_TOOL_OPTIONS 环境变量没有改变,所以每次我运行java 时,它都无法尝试抓取正在运行的 JVM 应用程序占用的端口在容器本身中。
    • 我想我根本没有帮助,但是嘿,很高兴你把它修好了,伙计:)
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多