首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Java 9+发现JMX临时端口号

为Java 9+发现JMX临时端口号
EN

Stack Overflow用户
提问于 2020-07-10 09:28:18
回答 1查看 371关注 0票数 7

这个问题:When using a JMX server with ephemeral port, how to get the server port number?表明我们可以在指定的params中使用sun.management.ConnectorAddressLink来发现短暂的JMX端口(如果我们用com.sun.management.jmxremote.port=0启动我们的进程)。

但是对于9+,这些类是私有的,不能再被访问了。有没有任何方法可以编程地找到JMX绑定到哪个端口?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 02:52:47

ConnectorAddressLink类可以通过jdk.internal.agent模块调用。

下面的示例代码展示了如何在java 9/11/14中以编程方式找到JMX临时端口(仅用OpenJDK版本进行测试)。

Java 9+代码:

在下面的代码中,您可以获得PID或使用0来表示当前的PID,因此提供了一种在这两种场景中显示JMX的方法,它们将是相同的。

代码语言:javascript
复制
public class JMXEphemeralPortTest_JAVA9Plus {

  public static void main(String[] args) throws IOException {
    String jmxURL = "NO JMX URL";
    String jmxURL2 = "NO JMX URL";
    if (isJava9Plus(System.getProperties())) {
      long pid = ProcessHandle.current().pid();
      jmxURL = "From Java 9 Plus:-->" + importRemoteFrom_Java9Plus(Math.toIntExact(pid));
      jmxURL2 = "From Java 9 Plus:-->" + importRemoteFrom_Java9Plus(0);
    }
    System.out.println(jmxURL);
    System.out.println(jmxURL2);
  }
  private static boolean isJava9Plus(Properties properties) {
    double javaVersion = Double.parseDouble(properties.getProperty("java.specification.version"));
    System.out.println("Java Version:"+javaVersion);
    return javaVersion >= 1.9;
  }
  private static String importRemoteFrom_Java9Plus(int pid) {
    try {
      final Class<?> clazz = Class.forName("jdk.internal.agent.ConnectorAddressLink");
      final Method method = clazz.getMethod("importRemoteFrom", int.class);
      final Object instance = clazz.getDeclaredConstructor().newInstance();
      Map<String, String> map = (Map<String, String>) method.invoke(instance, pid);
      return map.get("sun.management.JMXConnectorServer.0.remoteAddress");
    } catch (Exception e) {
      throw new IllegalStateException("Could not load needed java 9+ class", e);
    }
  }
}

*Java 9+ VM参数用于模块和JMX

代码语言:javascript
复制
--add-modules jdk.management,jdk.management.agent
--add-exports=jdk.management.agent/jdk.internal.agent=ALL-UNNAMED
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=0
-Dcom.sun.management.jmxremote.local.only=false

Java 9+结果:

Java版本:14.0来自Java 9 Plus:-->service:jmx:rmi:///jndi/rmi://XXXX:50678/jmxrmi来自Java9 Plus:-->service:jmx:rmi:///jndi/rmi://XXXX:50678/jmxrmi

Java版本:9.0来自Java 9 Plus:-->service:jmx:rmi:///jndi/rmi://XXXX:60342/jmxrmi来自Java 9 Plus:-->service:jmx:rmi:///jndi/rmi://XXXX:60342/jmxrmi

编程愉快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62831263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档