JBoss EAP を運用していると、JDK Mission Control(JMC)からリモート接続して状態を確認したくなることがあります。
ただし、JBoss EAP の管理インタフェース経由で JMX 接続する場合は、通常の JMX URL ではなく remote+http という独自プロトコルを使うため、そのままでは JMC から接続できません。
この記事では、JDK Mission Control からリモートの JBoss EAP に接続するための最小限の準備と、実際の接続方法を簡単にまとめます。
要約
先に要点だけまとめると、必要なのは次の内容です。
JBoss EAP を展開したディレクトリに含まれている bin/client/jboss-cli-client.jar を使います。
この JAR には、JBoss EAP の remote+http プロトコルを扱うために必要なクラスが含まれています。
JDK Mission Control を展開したディレクトリにある jmc.ini の末尾に、次の 1 行を追加します。
-Xbootclasspath/a:./jboss-cli-client.jar
この例では jboss-cli-client.jar を jmc.ini と同じ場所に置いていますが、JAR の配置場所は任意です。
別の場所に置く場合は、その場所に合わせてパスを書き換えれば問題ありません。
JMX サービス URL には、たとえば次のような形式を使います。
service:jmx:remote+http://localhost:9990
これは、localhost 上で動作している JBoss EAP の管理ポート 9990 に接続する例です。
実際にリモート接続する場合は、localhost の部分を対象サーバのホスト名または IP アドレスに置き換えます。
環境によっては認証も必要です。
Galleon で JBoss EAP を構築している場合は、管理ユーザとして ADMIN_USERNAME と ADMIN_PASSWORD の環境変数を利用できます。
なぜ追加の JAR が必要なのか
JMC は標準の JMX 接続には対応していますが、JBoss EAP の remote+http は一般的な JMX プロトコルではありません。
そのため、JMC 側に JBoss EAP 用のクライアントライブラリを読み込ませる必要があります。
そこで使うのが、JBoss EAP に含まれている jboss-cli-client.jar です。
この JAR を JMC の起動時に読み込ませることで、service:jmx:remote+http://... という URL を解釈できるようになります。
手順 1: jboss-cli-client.jar を用意する
まず、JBoss EAP を展開したディレクトリから次の JAR を探します。
bin/client/jboss-cli-client.jar
これを JMC 側から参照できる場所に置きます。
手軽なのは、jmc.ini と同じディレクトリにコピーしてしまう方法です。
もちろん、別のディレクトリに置いても構いません。
その場合は、後で jmc.ini に書くパスを正しく合わせてください。
手順 2: jmc.ini に設定を追加する
次に、JDK Mission Control を展開したディレクトリにある jmc.ini を開きます。
その一番最後に、次の 1 行を追加します。
-Xbootclasspath/a:./jboss-cli-client.jar
この設定は、JMC 起動時に jboss-cli-client.jar を読み込ませるためのものです。
もし jboss-cli-client.jar を別の場所に置いた場合は、たとえば次のように絶対パスや相対パスで指定してください。
-Xbootclasspath/a:/path/to/jboss-cli-client.jar
大事なのは、JAR の置き場所そのものではなく、jmc.ini に書いたパスが正しいことです。
手順 3: JMC から JBoss EAP に接続する
JMC を起動したら、新しい接続先として JBoss EAP の JMX サービス URL を指定します。 たとえばローカル環境であれば、次の URL を使えます。
service:jmx:remote+http://localhost:9990
この URL の意味は次のとおりです。
service:jmx: は JMX サービス URL の接頭辞です。
remote+http は JBoss EAP 独自の接続プロトコルです。
localhost:9990 は JBoss EAP の管理インタフェースの接続先です。
リモートサーバへ接続する場合は、次のように書き換えます。
service:jmx:remote+http://your-hostname:9990
認証が有効になっている場合は、管理ユーザ名とパスワードもあわせて指定します。
Galleon で構築した環境では、ADMIN_USERNAME と ADMIN_PASSWORD を使って管理ユーザを設定していることがあります。
うまく接続できないときの確認ポイント
もっとも分かりやすい典型例は、jboss-cli-client.jar が正しく読み込まれていないケースです。
この場合、JMC は remote+http を理解できず、次のような例外が発生します。
org.openjdk.jmc.rjmx.common.ConnectionException caused by java.net.MalformedURLException: Unsupported protocol: remote+http
at org.openjdk.jmc.rjmx.common.internal.RJMXConnection.connect(RJMXConnection.java:364)
at org.openjdk.jmc.rjmx.internal.ServerHandle.doConnect(ServerHandle.java:121)
at org.openjdk.jmc.rjmx.internal.ServerHandle.connect(ServerHandle.java:111)
at org.openjdk.jmc.console.ui.editor.internal.ConsoleEditor$ConnectJob.run(ConsoleEditor.java:99)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.net.MalformedURLException: Unsupported protocol: remote+http
at java.management/javax.management.remote.JMXConnectorFactory.newJMXConnector(JMXConnectorFactory.java:366)
at org.openjdk.jmc.rjmx.common.internal.RJMXConnection.connectJmxConnector(RJMXConnection.java:591)
at org.openjdk.jmc.rjmx.common.internal.RJMXConnection.establishConnection(RJMXConnection.java:572)
at org.openjdk.jmc.rjmx.common.internal.RJMXConnection.connect(RJMXConnection.java:357)
... 4 more
この例外が出た場合は、まず次の点を確認すると切り分けしやすいです。
jmc.ini に -Xbootclasspath/a:... の行が追加されているか。
その行が jmc.ini の末尾に正しく書かれているか。
指定した jboss-cli-client.jar のパスが正しいか。
JMC を設定変更後に再起動しているか。
ここが通っていれば、少なくとも remote+http を理解できないという段階の問題は解消できます。
まとめ
JDK Mission Control から JBoss EAP に接続するには、JBoss EAP 付属の jboss-cli-client.jar を JMC に読み込ませる必要があります。
設定先は jmc.ini で、-Xbootclasspath/a:... を追加します。
接続先 URL には、JBoss EAP 独自の remote+http プロトコルを使った service:jmx:remote+http://ホスト名:9990 形式を指定します。
認証が必要な環境では、管理ユーザの資格情報も必要です。
Galleon 構築環境では ADMIN_USERNAME と ADMIN_PASSWORD を使っていることがあります。
JMC 側で Unsupported protocol: remote+http が出る場合は、まず jboss-cli-client.jar の読み込み設定を疑うのが近道です。