2016-03-29 11 views
2

Ich habe einen Code, der mit JMX verbindet und mBean mit Namen erhält. Jetzt schreibe ich Tests mit JUnit dafür. Ich habe bereits einige Tests ohne Authentifizierung mit etwas wie diesem gemacht:Laufzeiteinstellung JVM-Argumente für JMX

Jetzt möchte ich einen Test mit Authentifizierung durchführen. Also muss ich nächste JVM properies angeben:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=1234 
-Dcom.sun.management.jmxremote.authenticate=true 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.access.file=/somepath/jmxremote.access 
-Dcom.sun.management.jmxremote.password.file=/somepath/jmxremote.password 

ich schon versucht, vorbei diese Eigenschaften in JMXConnectorServer Umgebungsvariable. Auch ich habe versucht System.setProperty. Aber es ist fehlgeschlagen, da die Verbindung ohne Anmeldeinformationen verfügbar war. Die einzige Möglichkeit, die es Arbeit macht, ist: Ich möchte zu vermeiden, solche Art der Sache, wegen der Notwendigkeit

private static void startJmxServer() throws Exception { 
    String name = ManagementFactory.getRuntimeMXBean().getName(); 
    VirtualMachine vm = VirtualMachine.attach(name.substring(0, name.indexOf('@'))); 

    String lca = vm.getAgentProperties().getProperty("com.sun.management.jmxremote.localConnectorAddress"); 

    if (lca == null) { 
     Path p = Paths.get(System.getProperty("java.home")).normalize(); 

     if (!"jre".equals(p.getName(p.getNameCount() - 1).toString() 
      .toLowerCase())) { 
      p = p.resolve("jre"); 
     } 

     File f = p.resolve("lib").resolve("management-agent.jar").toFile(); 

     if (!f.exists()) { 
      throw new IOException("Management agent not found"); 
     } 

     String options = String.format("com.sun.management.jmxremote.port=%d, " + 
      "com.sun.management.jmxremote.authenticate=true, " + 
      "com.sun.management.jmxremote.ssl=false, " + 
      "com.sun.management.jmxremote.access.file=/somepath/jmxremote.access, " + 
      "com.sun.management.jmxremote.password.file=/somepath/jmxremote.password", PORT); 
     vm.loadAgent(f.getCanonicalPath(), options); 
    } 

    vm.detach(); 

    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

    Example exampleMBean = new Example(); 

    ObjectName exampleName = new ObjectName(MBEAN_NAME); 
    mbs.registerMBean(exampleMBean, exampleName); 
} 

Aber wie wurde Agent geladen ich nicht ändern Eigenschaften VM-Test ohne authentication.Also laufen in der manuellen Definition von tools.jar und möchte gängige JMX-Tools verwenden. Irgendeine Idee, wie man das schafft?

Antwort

2

Authentifizierung Konfiguration ist in environment übergeben - das zweite Argument zu JMXConnectorServerFactory.newJMXConnectorServer.

HashMap<String, Object> env = new HashMap<>(); 
    env.put("jmx.remote.x.password.file", "/somepath/jmxremote.password"); 
    env.put("jmx.remote.x.access.file", "/somepath/jmxremote.access"); 

    JMXConnectorServer connectorServer = 
     JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs); 

Beachten Sie, dass sich die Attributnamen hier von den Eigenschaftsnamen unterscheiden.

Wenden Sie sich von JDK-Quellen an ConnectorBootstrap.java, um zu sehen, wie der Standard-JMXConnectorServer initialisiert wird.

+0

Vielen Dank! Du hast meinen Tag gerettet! Ich habe versucht, die gleichen Eigenschaftennamen in den Umgebungsattributen zu verwenden. Aber jetzt funktioniert alles wie erwartet. –