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ı?
Ç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. –