リモートJMXによるネイティブ実行可能ファイルのビルドおよび実行

GraalVMネイティブ・イメージでビルドされた実行可能ファイルでは、Java Management Extensions (JMX)を使用したリモート管理が可能です。

ノート: この機能は試験段階です。

このガイドでは、JMXを使用して、このようなネイティブ実行可能ファイルをビルド、実行および操作するために必要なステップについて説明します。また、カスタム管理対象Bean (MBean)をJMXサーバーに登録する方法と、そのネイティブ・イメージとの連携に必要な追加ステップも示します。

現在サポートされている機能と制限

クライアントからリモートのMBeanサーバーへのJMX接続がサポートされています。クライアント、サーバー、またはその両方がネイティブ実行可能ファイルである場合があります。MXBeanおよび標準ユーザー定義のMBeanのみがサポートされています。動的およびモデルMBeanは、管理インタフェースが実行時に定義されるためサポートされていません。MXBeanのリモート管理はサポートされていますが、ネイティブ・イメージですべてのプラットフォームMXBean機能が実装されたり、適用できるわけではありません。また、標準のMBeanを定義して使用するには、メタデータ構成を指定する必要があります。これについては、このガイドで詳しく説明します。

ステップ1: デモ・アプリケーションの作成

demoという名前のディレクトリにデモ・アプリケーションを作成します。作業ディレクトリをそこに変更し、そのディレクトリからコマンドを実行します。

次のコードをSimpleJmx.javaという名前のファイルに保存します。main()メソッドは、カスタムMBeanを登録してから無限ループするため、VisualVMを使用してプロセスを検査する時間があります。

import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;

public class SimpleJmx {
    public static void main(String args[]) throws Exception {
        ObjectName objectName = new ObjectName("com.jmx.test.basic:name=simple");
        Simple simple = new Simple();
        simple.setName("someName");
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        server.registerMBean(simple, objectName);
        while (true) {
            Thread.sleep(1000);
            System.out.println("JMX server running...");
        }
    }

    public static interface SimpleMBean {
        String getName();

        void setName(String name);

        String print();
    }

    static class Simple implements SimpleMBean {
        private String name;

        @Override
        public String getName() {
            return name;
        }

        @Override
        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String print() {
            return "Print output " + name;
        }
    }
}

ステップ2: Javaバイトコードへのコンパイル

  1. GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

  2. GraalVM JDKを使用してJavaファイルをコンパイルします:

     $JAVA_HOME/bin/javac SimpleJmx.java
    

    これにより、SimpleJmx.classSimpleJmx$Simple.classおよびSimpleJmx$SimpleMBean.classファイルが作成されます。

ステップ3: 動的プロキシ構成の作成

JMXは、Javaの動的機能である動的プロキシを使用して、MBeanにアクセスします。実行時にカスタムSimpleMBeanと対話できるようにするには、MBeanインタフェースの追加の動的プロキシ構成をネイティブ・イメージに提供する必要があります。そのためには、次の内容を含むproxy-config.JSONという名前のJSONファイルを作成します:

[
  { "interfaces": [ "SimpleJmx$SimpleMBean"] }
]

次のステップで、このJSONファイルをnative-imageビルダーに渡します。

ステップ4: JMXサポートを使用したネイティブ実行可能ファイルのビルド

VMモニタリングを有効にしてネイティブ実行可能ファイルをビルドします:

$JAVA_HOME/bin/native-image --enable-monitoring=jmxserver,jvmstat  -H:DynamicProxyConfigurationFiles=proxy-config.json SimpleJmx

--enable-monitoring=jmxserverオプションは、着信接続の受入れを可能にするJMXサーバー機能を有効にします。--enable-monitoring=jmxclientオプションは、送信接続を可能にするJMXクライアント機能を有効にします。両方の機能をカンマ区切りで一緒に使用できます(例: --enable-monitoring=jmxserver,jmxclient)。VisualVMおよびその他のJVMによる検出を有効にする場合は、jvmstatオプションも含める必要があります(--enable-monitoring=jmxserver,jmxclient,jvmstat)。

ステップ5: JMXプロパティを使用した実行可能ファイルの実行

次に、JMXプロパティを使用してネイティブ実行可能ファイルを実行します:

./simplejmx -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9996 -Dcom.sun.management.jmxremote.ssl=false

これにより、パスワード認証またはポート9996を使用したSSLを使用せずに、単純なJMXサーバーとしてアプリケーションが起動されます。このガイドに示す、通常のすべてのプロパティを適用するようにJMXを構成できますが、この例では、簡略化のために基本的な構成を使用します。

ステップ6: VisualVMを使用した検査

  1. VisualVMを起動して、マネージドBeanをわかりやすい方法で表示します。VisualVMは個別に出荷され、最初にguを使用してGraalVMに追加してから起動する必要があることに注意してください:

     $JAVA_HOME/bin/gu install visualvm
     $JAVA_HOME/bin/visualvm
    
  2. "VisualVM-MBeans"プラグインがインストールされていることを確認してください(「ツール」「プラグイン」「使用可能なプラグイン」→VisualVM-MBeansを選択し、「インストール」をクリックします)。

  3. 「アプリケーション」タブに移動し、SimpleJmxプロセスを選択します。そこから「MBean」タブを選択できます。

    リモートJMX

  4. 「MBean」タブでは、以前に作成したカスタムMBeanを調べて、操作を実行できます。

    カスタムMBean属性

    カスタムMBean操作

結論として、ネイティブ・イメージでは、JMXを使用したリモート管理がサポートされるようになりました。ユーザーは、ネイティブ実行可能ファイルでJMXエージェントを有効にして、リモート・システムで実行されているクライアント・アプリケーションをモニターできます。