JMXの基本的な紹介
1. 前書き
Java Management Extensions (JMX) frameworkはJava 1.5で導入され、その開始以来、Java開発者コミュニティで広く受け入れられています。
Javaアプリケーションをローカルまたはリモートで管理するための、簡単に構成でき、スケーラブルで、信頼性があり、多少なりとも使いやすいインフラストラクチャを提供します。 このフレームワークは、アプリケーションのリアルタイム管理のためのMBeanの概念を導入しています。
この記事は、基本的なMBeanを作成およびセットアップし、JConsoleを介して管理するための初心者向けのステップバイステップガイドです。
2. JMXアーキテクチャ
JMXアーキテクチャは、3層のアプローチに従います。
-
Instrumentation layer:リソースの管理に使用されるJMXエージェントに登録されたMBean
-
JMX agent layer:は、管理対象MBeanのレジストリを維持し、それらにアクセスするためのインターフェイスを提供するコアコンポーネント(MbeanServer)です。
-
Remote management layer:は通常、JConsoleのようなクライアント側ツールです。
3. MBeanクラスの作成
MBeanを作成する際、準拠する必要がある特定のデザインパターンがあります。 モデルMBeanクラスは、次の名前のインターフェースを実装する必要があります:*“model class name” plus 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があります。
getter / setterも親インターフェースで宣言されていることに注意してください。
4. JMXエージェントを使用したインストルメンテーション
JMXエージェントは、ローカルまたはリモートで実行されるエンティティであり、エージェントに登録されたMBeanへの管理アクセスを提供します。
JMXエージェントのコアコンポーネントであるPlatformMbeanServerを使用して、GameMBeanを登録しましょう。
別のエンティティ(ObjectName)を使用して、GameクラスインスタンスをPlatformMbeanServerに登録します。これは、2つの部分で構成される文字列です。
-
domain:任意の文字列にすることができますが、MBeanの命名規則に従って、Javaパッケージ名を付ける必要があります(名前の競合を回避します)。
-
key:コンマで区切られた「key=value」ペアのリスト
この例では、ObjectName:“com.baledung.tutorial:type=basic,name=game”. __
ファクトリクラスjava.lang.management.ManagementFactoryからMBeanServerを取得します。
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
そして、カスタムObjectNameを使用してモデルMBeanクラスを登録します。
ObjectName objectName = null;
try {
objectName = new ObjectName("com.example.tutorial:type=basic,name=game");
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
最後に、テストできるようにするために、whileループを追加して、JConsoleを介してMBeanにアクセスする前にアプリケーションが終了しないようにします。
while (true) {
}
5. MBeanへのアクセス
5.1. クライアント側から接続する
-
Eclipseでアプリケーションを開始します
-
Jconsoleを起動します(マシンのJDKインストールディレクトリのbinフォルダーにあります)
-
接続→新しい接続→このチュートリアルのローカルJavaプロセスを選択→接続→安全でないSSL接続の警告→安全でない接続を続行
-
接続が確立されたら、[表示]ペインの右上の[MBeans]タブをクリックします
-
登録されたMBeanのリストは左の列に表示されます
-
com.example.tutorial→basic→gameをクリックします
-
ゲームでは、2つの行があり、それぞれ属性と操作に対応します。
プロセスのJConsole部分を簡単に見てみましょう。
5.2. MBeanの管理
MBean管理の基本は簡単です。
-
属性は読み取りまたは書き込み可能
-
メソッドを呼び出すことができ、引数をメソッドに提供したり、メソッドから返された値を提供したりできます。
それが実際のGameMBeanにとって何を意味するかを見てみましょう。
-
attribute:は、属性playerNameに新しい値を入力します(例:「Messi」)。Refresh buttonをクリックします。
Eclipseコンソールに次のログが表示されます。
playerNameを値Messiに設定します
-
operations:は、メソッドplayFootBall()のString引数の値を入力します(例:「Barcelona」)。メソッドボタンをクリックします。 window alert for successful invocationが表示されます
次のログがEclipseコンソールに表示されます。
バルセロナでサッカーをするメッシ
6. 結論
このチュートリアルでは、MBeanを使用してJMX対応アプリケーションをセットアップする基本について触れました。 また、JConsoleなどの典型的なクライアント側ツールを使用して、インスツルメントされたMBeanを管理することについても説明しました。
JMXテクノロジーの分野は、その範囲と範囲が非常に広いです。 このチュートリアルは、それに向けた初心者のステップと見なすことができます。
このチュートリアルのソースコードはover on Githubにあります。