2016-03-29 22 views
2

JMX'e bağlanan ve adıma göre mBean aldığım bazı kodlar var. Şimdi bunun için JUnit ile testler yazıyorum. Zaten böyle bir şey kullanmadan kimlik doğrulaması olmadan bazı testler yaptık:Çalışma zamanı ayarı JMX için JVM bağımsız değişkenleri

private static void startJmxServer() throws Exception { 
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

    LocateRegistry.createRegistry(PORT); 

    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + HOST + ':' + PORT + "/jmxrmi"); 
    JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); 

    Example exampleMBean = new Example(); 
    ObjectName exampleName = new ObjectName(MBEAN_NAME); 

    mbs.registerMBean(exampleMBean, exampleName); 

    connectorServer.start(); 
} 

Şimdi kimlik doğrulama ile bazı test yapmak istiyorum. Ben de bir sonraki JVM properies belirtmek gerekir:

-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 

Zaten JMXConnectorServer ortam değişkeni bu özelliklere geçen denedim. Ayrıca ben System.setProperty denedim. Ancak bağlantı, herhangi bir kimlik bilgisi olmadan kullanılabilir olduğu için başarısız oldu. o işi yapan tek yoludur:

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); 
} 

Ama ajan nedeniyle ihtiyaç, ben bir şey böyle tür kaçınmak istiyorum ediyorum authentication.Also olmadan testi çalıştırmak için VM özelliklerini değiştiremezsiniz yüklendi olarak tools.jar el ile tanımlamak ve ortak JMX araçlarını kullanmak istiyorum. Bunu nasıl yöneteceğiniz hakkında bir fikrin var mı?

cevap

2

Kimlik doğrulama yapılandırması environment - ikinci bağımsız değişken JMXConnectorServerFactory.newJMXConnectorServer olarak iletilmiştir.

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); 

Buradaki özellik adlarının özellik adlarından farklı olduğunu unutmayın.

Varsayılan JMXConnectorServer'ın nasıl başlatıldığını görmek için JDK kaynaklarından ConnectorBootstrap.java'a başvurun.

+0

Çok teşekkür ederim! Benim günümü yaptın! Ortam özelliklerinde aynı özellik adlarını kullanmaya çalışıyordum. Ama şimdi her şey beklendiği gibi çalışıyor. –