Я пытаюсь подключить работающий 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);
}
}