JVM毎に公開されるJMXローカルコネクタアドレスを取得する

複数のJVMで公開されているプラットフォームMXBean等のJMXBeanは、当然同一の名前を持っている訳で、その場合同一ホスト上の複数のJVM毎に公開されているはずのMXBeanに接続するにはどうすれば良いのか解らなかったのだが、ちゃんとドキュメントに書いてあった。※

JMX クライアント (や他のツール) は、そのエージェントに代わって Java VM が保持するプロパティーリストから、そのエージェントの JMX コネクタアドレスを取得できます。このリストに含まれるプロパティーは、Attach API. を使用するツールからアクセスできます。したがって、アプリケーションから起動したエージェントが構成情報を示すプロパティーを生成した場合、その構成情報はアプリケーションに接続するツールから利用できます。
2.  JMX テクノロジを使用する監視と管理 - プログラムによる監視および管理の設定

JMX ツールのコネクタへの接続とエージェントのアドレスの取得サンプル

static final String CONNECTOR_ADDRESS = "com.sun.management.jmxremote.localConnectorAddress";
VirtualMachine vm = VirtualMachine.attach(id);
 
//ローカルコネクタアドレスが格納されているプロパティを取得
String connectorAddress = vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
 
//コネクタアドレスが空の場合、エージェントのロードを試みる(まだロードされていないのかもしれない)
if (connectorAddress == null) {
   String agent = vm.getSystemProperties().getProperty("java.home") + File.separator + "lib" + File.separator + "management-agent.jar";
   vm.loadAgent(agent);
   //起動したエージェントからローカルコネクタアドレスを取得
   connectorAddress =  vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
}
//取得したコネクタアドレスを使って接続する
JMXServiceURL url = new JMXServiceURL(connectorAddress);
JMXConnector = JMXConnectorFactory.connect(url); 

アタッチAPIのgetAgentPropertiesメソッドの意味が前から疑問だったのだが、これでやっと理解できた。

※いつもの事だが、Javaの疑問点を調べる場合にはどうしてSunのドキュメントを後回しにしてしまうのだろう。大抵は書籍やネット上で類義の情報を散々探して、JSDKのソースコードも見たが解らなくて精も根も尽き果てた頃にSunのドキュメントに書いてあったりするんだよな。