#chiroito ’s blog

Java を中心とした趣味の技術について

JDK Mission Control からリモートの JBoss EAP に接続する

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.jarjmc.ini と同じ場所に置いていますが、JAR の配置場所は任意です。 別の場所に置く場合は、その場所に合わせてパスを書き換えれば問題ありません。

JMX サービス URL には、たとえば次のような形式を使います。

service:jmx:remote+http://localhost:9990

これは、localhost 上で動作している JBoss EAP の管理ポート 9990 に接続する例です。 実際にリモート接続する場合は、localhost の部分を対象サーバのホスト名または IP アドレスに置き換えます。

環境によっては認証も必要です。 Galleon で JBoss EAP を構築している場合は、管理ユーザとして ADMIN_USERNAMEADMIN_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_USERNAMEADMIN_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_USERNAMEADMIN_PASSWORD を使っていることがあります。

JMC 側で Unsupported protocol: remote+http が出る場合は、まず jboss-cli-client.jar の読み込み設定を疑うのが近道です。