簡體   English   中英

發現 Java 的 JMX 臨時端口號 9+

[英]Discovering JMX Ephemeral Port Number for Java 9+

這個問題: 當使用帶有臨時端口的JMX服務器時,如何獲取服務器端口號? 表示我們可以使用帶有指定參數的sun.management.ConnectorAddressLink來發現臨時 JMX 端口(如果我們使用com.sun.management.jmxremote.port=0開始我們的進程)。

但是,對於 Java 9+,這些類已設為私有,無法再訪問。 有什么方法可以通過編程方式找到 JMX 綁定到的端口?

ConnectorAddressLink class 可以通過 jdk.internal.agent 模塊調用。

下面的示例代碼顯示了我們如何以編程方式在 java 9/11/14 中找到 JMX 臨時端口(僅使用 OpenJDK 版本測試)。

Java 9+ 代碼:

在下面的代碼中,您可以獲得 PID 或使用 0 表示當前 PID,因此提供了一種在兩種情況下顯示 JMX URL 的方法,它們將是相同的。

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 Arguments 用於模塊和 JMX

--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 Version:14.0 From Java 9 Plus:-->service:jmx:rmi:///jndi/rmi://XXXX:50678/jmxrmi From Java 9 Plus:-->service:jmx:rmi:///jndi /rmi://XXXX:50678/jmxrmi

Java Version:9.0 From Java 9 Plus:-->service:jmx:rmi:///jndi/rmi://XXXX:60342/jmxrmi From Java 9 Plus:-->service:jmx:rmi:///jndi /rmi://XXXX:60342/jmxrmi

快樂編程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM