Java локальная ошибка соединения JMX `java .rmi.ConnectIOException: ошибка во время установления соединения JRMP` - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь подключить работающий java процесс к локальному через Java JMX. Но это не удалось с неясной ошибкой.

Я могу успешно загрузить агент управления целевого процесса и получить URL JMX в свойстве агента через ключ com.sun.management.jmxremote.localConnectorAddress. URL JMX: service:jmx:rmi://127.0.0.1/stub/rO0ABXN9AAAAAQAlamF2YXgubWFuYWdlbWVudC5yZW1vdGUucm1pLlJNSVNlcnZlcnhyABdqYXZhLmxhbmcucmVmbGVjdC5Qcm94eeEn2iDMEEPLAgABTAABaHQAJUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlcjt4cHNyAC1qYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN0SW52b2NhdGlvbkhhbmRsZXIAAAAAAAAAAgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc4AAtVbmljYXN0UmVmMgAADTE5Mi4xNjguMC4xMTAAAP1C8hqcAOQs6PmVxAuLAAABcb+cg3SAAQB4.

Но при попытке подключиться к URL-адресу JMX появляется 1007 * неясная ошибка.

У меня есть поиск этой ошибки, но я все еще не знаю, почему эта ошибка произошла. Кто-нибудь знает, что вызвало это?

Мое окружение:
- MA C os ctalina - java 1.8

/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre
service:jmx:rmi://127.0.0.1/stub/rO0ABXN9AAAAAQAlamF2YXgubWFuYWdlbWVudC5yZW1vdGUucm1pLlJNSVNlcnZlcnhyABdqYXZhLmxhbmcucmVmbGVjdC5Qcm94eeEn2iDMEEPLAgABTAABaHQAJUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlcjt4cHNyAC1qYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN0SW52b2NhdGlvbkhhbmRsZXIAAAAAAAAAAgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc4AAtVbmljYXN0UmVmMgAADTE5Mi4xNjguMC4xMTAAAP1C8hqcAOQs6PmVxAuLAAABcb+cg3SAAQB4

Exception in thread "main" java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    java.io.EOFException
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:307)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
    at com.sun.proxy.$Proxy0.newClient(Unknown Source)
    at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2430)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:308)
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270)
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:229)
    at com.ibm.LogLevelChanger.connect(LogLevelChanger.java:144)
    at com.ibm.LogLevelChanger.execute(LogLevelChanger.java:110)
    at com.ibm.LogLevelChanger.main(LogLevelChanger.java:247)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:267)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:246)
    ... 12 more

Мой код указан следующим образом:

    private  LoggingMXBean connect(final String pid) throws AttachNotSupportedException, IOException, MalformedObjectNameException, MalformedURLException {
        final VirtualMachine vm= VirtualMachine.attach(pid);
        this.loadManagementAgent(vm);
        final Properties agentProperties = vm.getAgentProperties();
        System.out.println(agentProperties);
        final String connectorAddress= (String) agentProperties.get("com.sun.management.jmxremote.localConnectorAddress");
        final JMXServiceURL serviceUrl= new JMXServiceURL(connectorAddress);
        System.out.println(serviceUrl);
        final JMXConnector connector= JMXConnectorFactory.connect(serviceUrl);
        final MBeanServerConnection connection= connector.getMBeanServerConnection();
        final ObjectName mbeanName = new ObjectName(LogManager.LOGGING_MXBEAN_NAME);
        final LoggingMXBean mxbeanProxy = JMX.newMXBeanProxy(connection, mbeanName, LoggingMXBean.class);
        return mxbeanProxy;
    }

...

    private void loadManagementAgent(final VirtualMachine vm) throws IOException {
        final String home = vm.getSystemProperties().getProperty("java.home");
        System.out.println(home);
        // Normally in ${java.home}/jre/lib/management-agent.jar but might
        // be in ${java.home}/lib in build environments.

        String agent = home + File.separator + "jre" + File.separator + "lib" + File.separator + "management-agent.jar";
        File f = new File(agent);
        if (!f.exists()) {
            agent = home + File.separator +  "lib" + File.separator +
                    "management-agent.jar";
            f = new File(agent);
            if (!f.exists()) {
                throw new IOException("Management agent not found");
            }
        }

        agent = f.getCanonicalPath();
        try {
            vm.loadAgent(agent, "com.sun.management.jmxremote");
        } catch (AgentLoadException x) {
            throw new IOException(x);
        } catch (AgentInitializationException x) {
            throw new IOException(x);
        }
    }

...