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

GraalVMネイティブ・イメージでビルドされたネイティブ・アプリケーションでは、Java Management Extensions (JMX)を使用したリモート管理が可能です。

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

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

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

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

デモの実行

前提条件

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

  1. 次のコードを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. GraalVM JDKを使用してアプリケーションをコンパイルします:
     javac SimpleJmx.java
    

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

  3. 動的プロキシ構成を追加します。JMXは、Javaの動的機能である動的プロキシを使用して、MBeanにアクセスします。実行時にカスタムSimpleMBeanと対話できるようにするには、MBeanインタフェースの追加の動的プロキシ・メタデータをネイティブ・イメージに提供する必要があります。そのためには、reachability-metadata.jsonという名前のJSONファイルを次の内容で作成または変更します:
     {
       "reflection": [
         {
           "type": {
             "proxy": ["SimpleJmx$SimpleMBean"]
           }
         }
       ]
     }
    
  4. VM検査を有効にしてネイティブ実行可能ファイルをビルドし、JSON構成ファイルをnative-imageに渡します:
     native-image --enable-monitoring=jmxserver,jmxclient,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プロパティを使用してネイティブ実行可能ファイルを実行します:
     ./simplejmx -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9996 -Dcom.sun.management.jmxremote.ssl=false
    

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

これでJMXサーバーが実行されたため、VisualVMを使用してMBeanを検査します。

VisualVMを使用したMBeanの検査

  1. VisualVMを起動して、マネージドBeanをわかりやすい方法で表示します。

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

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

    リモートJMX

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

    カスタムMBean属性

    カスタムMBean操作

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