1. 序章

Java Management Extensions(JMX)フレームワークはJava 1.5で導入され、その開始以来、Java開発者コミュニティで広く受け入れられてきました。

これは、Javaアプリケーションをローカルまたはリモートで管理するための、簡単に構成可能で、スケーラブルで、信頼性が高く、多かれ少なかれ使いやすいインフラストラクチャを提供します。 このフレームワークは、アプリケーションのリアルタイム管理のためのMBeanの概念を導入しています。

この記事は、基本的なMBeanを作成およびセットアップし、JConsoleを介して管理するための初心者向けのステップバイステップガイドです。

2. JMXアーキテクチャ

JMXアーキテクチャは、次の3層のアプローチに従います。

  1. インストルメンテーション層:リソースの管理に使用されるJMXエージェントに登録されたMBean
  2. JMXエージェント層:管理対象MBeanのレジストリを維持し、それらにアクセスするためのインターフェースを提供するコアコンポーネント(MbeanServer)
  3. リモート管理レイヤー:通常はJConsoleのようなクライアント側ツール

3. MBeanクラスの作成

MBeanを作成する際には、準拠しなければならない特定のデザインパターンがあります。 モデルMBeanクラスは、次の名前のインターフェースを実装する必要があります:「モデルクラス名」とMBean。

それでは、MBeanインターフェースとそれを実装するクラスを定義しましょう。

public interface GameMBean {

    public void playFootball(String clubName);

    public String getPlayerName();

    public void setPlayerName(String playerName);

}
public class Game implements GameMBean {

    private String playerName;

    @Override
    public void playFootball(String clubName) {
        System.out.println(
          this.playerName + " playing football for " + clubName);
    }

    @Override
    public String getPlayerName() {
        System.out.println("Return playerName " + this.playerName);
        return playerName;
    }

    @Override
    public void setPlayerName(String playerName) {
        System.out.println("Set playerName to value " + playerName);
        this.playerName = playerName;
    }
}

Game クラスは、親インターフェイスのメソッド playFootball()をオーバーライドします。 これとは別に、クラスにはメンバー変数playerNameとそのゲッター/セッターがあります。

getter/setterも親インターフェイスで宣言されていることに注意してください。

4. JMXエージェントを使用したインストルメンテーション

JMXエージェントは、ローカルまたはリモートで実行されているエンティティであり、登録されているMBeanへの管理アクセスを提供します。

JMXエージェントのコアコンポーネントであるPlatformMbeanServerを使用して、 GameMBeanを登録してみましょう。

別のエンティティObjectNam eを使用して、GameクラスインスタンスをPlatformMbeanServerに登録します。 これは、2つの部分で構成される文字列です。

  • domain :任意の文字列にすることができますが、MBeanの命名規則に従って、Javaパッケージ名を指定する必要があります(名前の競合を回避します)。
  • key:コンマで区切られた「 key =value」ペアのリスト

この例では、「com.baledung.tutorial:type = basic、name=game」を使用します。

ファクトリクラスjava.lang.management.ManagementFactory。からMBeanServerを取得します

次に、作成した ObjectName:を使用してモデルMBeanを登録します。

try {
    ObjectName objectName = new ObjectName("com.baeldung.tutorial:type=basic,name=game");
    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    server.registerMBean(new Game(), objectName);
} catch (MalformedObjectNameException | InstanceAlreadyExistsException |
        MBeanRegistrationException | NotCompliantMBeanException e) {
    // handle exceptions
}

最後に、テストできるようにするために、 while ループを追加して、JConsoleを介してMBeanにアクセスする前にアプリケーションが終了しないようにします。

while (true) {
}

5. MBeanへのアクセス

5.1. クライアント側から接続する

  1. Eclipseでアプリケーションを起動します
  2. Jconsoleを起動します(マシンのJDKインストールディレクトリのbinフォルダにあります)
  3. 接続->新しい接続->このチュートリアルのローカルJavaプロセスを選択->接続->安全でないSSL接続の警告->安全でない接続を続行
  4. 接続が確立されたら、ビューペインの右上の[MBeans]タブをクリックします
  5. 登録されているMBeanのリストが左側の列に表示されます
  6. com.baeldung.tutorial->basic->gameをクリックします
  7. ゲームでは、属性と操作用にそれぞれ1つずつ、合計2つの行があります。

プロセスのJConsole部分を簡単に見てみましょう。

5.2. MBeanの管理

MBean管理の基本は単純です。

  • 属性は読み取りまたは書き込みが可能
  • メソッドを呼び出して引数を指定したり、メソッドから値を返したりすることができます

それがGameMBeanの実際の意味を見てみましょう。

  • attribute:属性 playerName の新しい値を入力します(例:「Messi」)。[更新]ボタンをクリックします。

次のログがEclipseコンソールに表示されます。

playerNameを値Messiに設定します

  • 操作:メソッド playFootBall()のString引数の値を入力します(例:「バルセロナ」)。メソッドボタンをクリックします。 呼び出しが成功した場合のウィンドウアラートが表示されます

次のログが日食コンソールに表示されます。

バルセロナでサッカーをするメッシ

6. 結論

このチュートリアルでは、MBeanを使用してJMX対応アプリケーションをセットアップするための基本に触れました。 また、JConsoleなどの一般的なクライアント側ツールを使用してインストルメント化されたMBeanを管理する方法についても説明しました。

JMXテクノロジーの領域は、範囲と範囲が非常に広いです。 このチュートリアルは、それに向けた初心者のステップと見なすことができます。

このチュートリアルのソースコードは、Githubにあります。