2016-03-29 13 views
2

JMXに接続し、mBeanを名前で取得するコードがあります。今はJUnitでテストを書いています。私はすでに次のようなものを使用して認証なしでいくつかのテストを行ってきました:JMXのランタイム設定JVM引数

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

私は認証でいくつかのテストをしたいと思います。だから私は、次のJVMのproperiesを指定する必要があります。

-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 

私はすでにJMXConnectorServer環境変数に、このプロパティを渡して試してみました。また、私はSystem.setPropertyを試しました。しかし、接続は資格情報なしで利用可能であったため、失敗しました。それが動作します 唯一の方法は、次のとおりです。

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

しかし、エージェントがロードされたように私には理由が必要で、私は事のように並べ替えを避けたいよauthentication.Alsoせずにテストを実行するVMのプロパティを変更することはできません。手動でtools.jarを定義し、共通のJMXツールを使用したいと考えています。どのようにこれを管理するための任意のアイデア?

答えて

2

environmentに認証設定が渡されます。第2引数は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); 

ここで、属性名はプロパティ名と異なることに注意してください。

JDKソースのConnectorBootstrap.javaに問い合わせて、デフォルトのJMXConnectorServerがどのように初期化されているかを確認してください。

+0

ありがとうございました!あなたのおかげで幸せになれた!環境属性で同じプロパティ名を使用しようとしていました。しかし、今はすべてが期待どおりに機能します。 –

関連する問題