JavaアプリケーションへのJava Management Extensions (JMX)インストゥルメントの追加

予想される所要時間: 60分

NetBeans JMXウィザード・モジュールは、NetBeans IDEでJMXテクノロジとワークフローを統合します。このモジュールを使用すると、管理アプリケーションの迅速な開発、既存アプリケーションへの管理の追加、マネージャ・アプリケーションの開発、仮想マシンの状態のモニターが可能になります。

このチュートリアルでは、既存のアプリケーション(NetBeansサンプルAnagrams Gameアプリケーション)に管理を追加する方法を示します。まず、非管理可能Anagram Javaプロジェクトを作成します。JMXウィザードを使用して管理の90%を生成します。次に、アプリケーションに固有の管理動作を実装します。最後に、JConsoleでプロジェクトの実行/デバッグを使用して、Anagram MBeanを視覚化します。

チュートリアルの課題

このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます

前提条件

このチュートリアルは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。

Javaプラットフォームのモニタリングおよび管理の内容が参考になる場合もあります。

チュートリアルに必要なソフトウェア

このチュートリアルでは、コンピュータに次のソフトウェアをインストールしておく必要があります。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 7.2、7.3、7.4、8.0、Javaバージョン
Java Development Kit (JDK) バージョン7または8
JMXプラグイン NetBeans更新センターから入手可能
JConsoleプラグイン NetBeans更新センターから入手可能

JMXおよびJConsoleのプラグインをインストールするには、「ツール」>「プラグイン」を選択し、NetBeansアップデート・センターからモジュールをダウンロードします。

リソース

  • NetBeansヘルプ・コンテンツ(「ヘルプ」>「ヘルプの目次」>「JMX」)。このヘルプはウィザードからも利用できます。

課題1: NetBeansサンプルAnagram Gameプロジェクトの作成

この課題の目標は、実行可能なJavaプロジェクトを作成することです。Anagramゲームは、単語内の文字を並べ替えてユーザーに表示し、ユーザーがアナグラムを解くのを待つSwingアプリケーションです。

  1. 「ファイル」>「新規プロジェクト」([Ctrl]-[Shift]-[N])を選択します。
  2. 「サンプル」>「Java」カテゴリを選択します。
  3. Anagram Gameプロジェクトを選択します。「次」をクリックします。
  4. 「プロジェクトの名前と場所」パネルでプロジェクトの場所を設定するか、デフォルト値で問題なければそのままにします。「メイン・プロジェクトとして設定」チェックボックスが選択されていない場合は選択します。これによって、後続の処理が簡単になります。「終了」をクリックします。

    「終了」をクリックすると、IDEによってAnagram Gameプロジェクトが作成され、そのプロジェクトが「プロジェクト」ウィンドウに表示されます。

  5. AnagramGameプロジェクトを右クリックし、「プロパティ」を選択します。
  6. 「ソース」カテゴリを選択し、「ソース/バイナリ形式」がJDK 7またはJDK 8に設定されていることを確認します。「OK」をクリックします。

    注意:「JDK 7」または「JDK 8」を選択するには、AnagramGameプロジェクトのJavaプラットフォームもそれぞれJDK 7またはJDK 8以上である必要があります。AnagramGameのJavaプラットフォームは、「プロパティ」ウィンドウの「ライブラリ」カテゴリで変更できます。

  7. Anagram Gameプロジェクト・ノードを右クリックし、「実行」を選択します。

「実行」をクリックすると、IDEによってAnagram Gameアプリケーションがビルドおよび起動されます。

課題2: AnagramsStats JMX標準MBeanとその管理インタフェースの作成

この課題の目標は、実装クラスと管理インタフェースで構成されるスケルトンJMX標準MBeanを作成することです。

次の手順を実行して、JMX標準MBeanを作成します。

  1. Anagram Gameプロジェクトがメイン・プロジェクトとして設定されていることを確認します。
  2. 「ファイル」>「新規ファイル」([Ctrl]-[N])を選択します。
  3. 「JMX」カテゴリから、「標準MBean」を選択します。「次」をクリックします。
    新規ファイル・ウィザードの標準MBeanファイル・タイプのスクリーンショット
  4. 「名前と場所」パネルで次の情報を入力します。
    • クラス名: AnagramsStats
    • 場所: ソース・パッケージ(デフォルト)
    • パッケージ: com.toy.anagrams.mbeans
    • 説明: Monitoring and Management of the Anagrams Game

    create_mbean2: 新しい標準MBeanの作成、手順2
  5. 「終了」をクリックします。

「終了」をクリックすると、AnagramsStats MBeanクラスおよびAnagramsStatsMBean MBeanインタフェースがAnagramGameプロジェクトのcom.toy.anagrams.mbeansパッケージに作成されます。これらは、次の課題で移入されるの空のスケルトンです。

課題3: AnagramsStats JMX標準MBeanへの属性、操作および通知の追加

この課題の目標は、ユーザーが新しいアナグラムを解くのにかかった時間をモニターし、アナグラムが解かれるたびにJMX通知が送信されるよう、生成されたMBeanスケルトンに移入することです。

MBeanには、次が含まれます。

  • LastThinkingTimeおよびNumResolvedAnagramsという名前の2つの属性
  • resetAllという名前の操作。
  • タイプAttributeChangeNotificationの通知。この通知はLastThinkingTimeが更新されると送信されます。

次の手順を実行して、MBeanスケルトンに移入します。

  1. NetBeansエディタでAnagramsStats.java MBean実装ファイルを開きます。
  2. ソース・エディタで右クリックし、ポップアップ・メニューで「JMX」>「MBean属性の追加」を選択します。
  3. 「属性の追加」ボタンをクリックして次の情報を指定し、LastThinkingTime属性を追加します。
    • 属性名: LastThinkingTime
    • 型: int
    • アクセス: 読取り専用
    • 説明: Elapsed time to solve last anagram

    注意:まだ「OK」をクリックしないでください。

  4. 「属性の追加」を再度クリックし、次のNumSolvedAnagrams属性を追加します。「OK」をクリックします。
    • 属性名: NumSolvedAnagrams
    • 型: int
    • アクセス: 読取り専用
    • 説明: Number of solved anagrams

    create_mbean7: LastThinkingTime属性の追加

    読取り専用のLastThinkingTimeおよびNumSolvedAnagrams属性を公開するために必要なコードが、AnagramsStats MBeanクラスとそのインタフェースの両方に生成されます。

    プライベート・フィールド宣言およびパブリック取得メソッドを確認できます。正確には、メンバー・ビューおよび生成されたコードを確認すると、getLastThinkingTimeおよびgetNumSolvedAnagramsメソッドがAnagramsStatsクラスとそのAnagramsStatsMBeanインタフェースの両方に生成されていることが確認できます。int型のプライベート・フィールドlastThinkingTimeおよびnumSolvedAnagramsも生成されており、実際の属性値の格納に使用されます。

    次に、ユーザーが解答までにかかった最小と最大の思考時間および現在ユーザーに表示されているアナグラムを追跡するために、属性をさらに3個追加します。

  5. ソース・エディタで右クリックし、ポップアップ・メニューで「JMX」>「MBean属性の追加」を選択します。
  6. 「属性の追加」ボタンをクリックし、次の属性を追加します。
    属性名 アクセス 説明
    MinThinkingTime int 読取り専用 アナグラムを解くのにかかった最小時間
    MaxThinkingTime int 読取り専用 アナグラムを解くのにかかった最大時間
    CurrentAnagram 文字列 読取り専用 現在解いているアナグラム

    ダイアログ・ボックスは次のイメージのような表示になります。

    さらに3個の属性を追加した後の「属性の追加」ダイアログのスクリーンショット

    注意:作成した属性がダイアログ・ボックスにリストされていることに注意してください。

  7. 「OK」をクリックして変更内容を保存します。
  8. ソース・エディタで右クリックし、ポップアップ・メニューで「JMX」>「MBean操作の追加」を選択します。
  9. 「操作の追加」をクリックし、resetAll()操作を追加して次の詳細を指定します。「OK」をクリックします。
    • 操作名: resetAll
    • 戻り型: void
    • パラメータ: (空のままにします)
    • 例外: (空のままにします)
    • 説明: Reset MBean state

    「操作の追加」ダイアログのスクリーンショット

    「OK」をクリックすると、resetAll操作を公開するために必要なコードがAnagramsStats MBeanクラスとそのインタフェースの両方に生成されていることが確認できます。

  10. ソース・エディタで右クリックし、ポップアップ・メニューで「JMX」>「NotificationEmitterインタフェースの実装」を選択します。
  11. 「NotificationEmitterインタフェースの実装」ダイアログで次の詳細を指定します。
    • 「ブロードキャスタへの委任の生成」を選択します。NotificationEmitterインタフェースによって宣言されているすべてのメソッドは、通知ブロードキャスタに委任することで実装されます。通知ブロードキャスタは、MBeanが通知を送信する方法を簡略化します。
    • 「プライベート順序番号とアクセッサの生成」を選択します。送信される各通知に追加される一意の順序番号値を処理するためのコードが生成されます。
    • 「通知の追加」をクリックします。通知表で次の詳細を指定します。
      • 通知クラス: javax.management.AttributeChangeNotification
      • 通知タイプ: (自動的にATTRIBUTE_CHANGEに設定されます)
      • 説明: Anagram is Solved

    「NotificationEmitterの実装」ダイアログのスクリーンショット

    「OK」をクリックします。

    NotificationEmitterインタフェースを実装するために必要なコードがAnagramsStats MBeanクラスに生成されていることが確認できます。生成された実装によって通知の処理がNotificationBroadcasterSupportクラスに委任されたことが確認できます。

  12. 変更を保存します。

この課題では、JMXウィザード・モジュールを使用して、属性、操作および通知の送信をMBeanに追加する方法を学習しました。これで、管理情報を公開するために必要なインフラストラクチャをMBeanに移入するために必要な手順が終了しました。AnagramsStats MBeanクラスの実装に内部ロジックを追加し、MBeanとAnagram Gameアプリケーションの間にブリッジを作成する必要があります。

課題4: AnagramsStats JMX標準MBeanへの実装コードの追加

この課題では、AnagramsStats MBeanクラスの実装に内部ロジックを追加します。

次の手順を実行して、実装コードを追加します。

  1. 属性にはすでにプライベート・フィールドが宣言されており、取得メソッドには何も追加する必要がありません。
  2. resetAll() メソッドを実装する必要があります。生成された本体は空です。resetAll()がコールされたら、単にすべてのカウンタを0に設定します。次(太字部分)のコード行をresetAll()メソッド本体に追加します。
    public void resetAll() {
        minThinkingTime = 0;
        maxThinkingTime = 0;
        lastThinkingTime = 0;
        numSolvedAnagrams = 0;
    }
  3. 次の処理を行う実装コードも追加する必要があります。
    • ユーザーが最後のアナグラムを解くのにかかった思考時間の計算
    • 最小および最大の思考時間の計算
    • 解かれたアナグラムのカウンタの増分
    • 現在のアナグラムの把握
    • アナグラムが解かれた時の通知の作成と送信

    その目的で、最後のアナグラムがユーザーに表示された時間を格納するためのプライベート・フィールドstartTime、前述の操作を実行するためのstartThinking()およびstopThinking()の2つのメソッドおよびsetCurrentAnagram()メソッドを追加します。

    次のコードをAnagramsStats.java(たとえば、クラスの実装の最後など)に追加します。

    /*
     * Methods exposed to Anagrams application to feed management with data.
     */
    
    //Stores the time at which a new anagram is proposed to the user.
    private long startTime;
    
    /**
     * A new Anagram is proposed to the user: store current time.
     */
    public void startThinking() {
        startTime = System.currentTimeMillis();
    }
    
    /**
     * An Anagram has been resolved.
     */
    public void stopThinking() {
    
        //Update the number of resolved anagrams
        numSolvedAnagrams++;
    
        // Compute last, min and max thinking times
        lastThinkingTime = (int) (System.currentTimeMillis() - startTime) / 1000 ;
        minThinkingTime = (lastThinkingTime < minThinkingTime || minThinkingTime == 0) ?
                          lastThinkingTime :
                          minThinkingTime;
        maxThinkingTime = (lastThinkingTime > maxThinkingTime) ?
                          lastThinkingTime :
                          maxThinkingTime;
    
        //Create a JMX Notification
        Notification notification = new Notification(AttributeChangeNotification.ATTRIBUTE_CHANGE,
                this,
                getNextSeqNumber(),
                "Anagram solved: " + currentAnagram);
    
        // Send a JMX notification.
        broadcaster.sendNotification(notification);
    }
    
    /**
     * Set latest anagram which has been computed by the Anagram application
     */
    public void setCurrentAnagram(String currentAnagram) {
        this.currentAnagram = currentAnagram;
    }

    startThinking()stopThinking()およびsetCurrentAnagram()の3つのメソッドはAnagramsStatsMBeanインタフェースで宣言されていないため、MBean管理インタフェースの一部ではないことに注意してください。ただし、アナグラムがユーザーに表示された時間、アナグラムが解かれた時間および現在のアナグラムをMBeanに示すためにAnagram Gameアプリケーションによってコールされるため、パブリックです。つまり、アプリケーションとMBeanの間のブリッジという必須部分です。

    アナグラムが解かれるたびにATTRIBUTE_CHANGEタイプのJMX通知が送信されることにも注意してください。

これで、MBeanの実装が終了しました。この項では、次の処理を可能にするためのコードおよびメソッドを追加しました。

  • 内部MBean状態の更新
  • アプリケーションからのコール
  • JMX通知の送信

課題5: 管理とアプリケーションの接続

この課題では、MBeanにアクセスして管理情報を渡すためのコードをAnagram Gameアプリケーションに追加します。

次の手順を実行します。

  1. エディタでAnagrams.javaを開きます。

    com.toy.anagrams.uiパッケージのAnagramsクラスは、Anagram Gameアプリケーションのmainクラスです。Anagramsクラスはユーザー・インタフェース・クラスでもあるため、ファイルはエディタの「デザイン」ビューで開きます。

  2. エディタ・ウィンドウの上部にある「ソース」ボタンをクリックして、「ソース」ビューでクラスを編集します。
  3. 次の空のinitManagement()プライベート・メソッドをAnagramsクラス(Anagramsコンストラクタの後)に追加します。
    /**
     * JMX initialization:
     * Create and register Anagrams MBean in Platform MBeanServer.
     * Initialize thinking time and current anagram.
     */
    private void initManagement() throws Exception {
    
    }
  4. 次のinitManagement()メソッドへのコールをAnagramsクラス・コンストラクタの最後、コンストラクタの終わりを表す終了の波括弧の前に追加します。
    //JMX Management initialization
    initManagement();
              

    また、コンパイルするには、throws Exception句をAnagrams()コンストラクタに追加し、Main()メソッド内のnew Anagrams().setVisible(true);文をtryとcatchで囲む必要があります。エディタの左マージンに提案グリフが表示されます。コードの行に挿入カーソルを置いて「Alt-Enter」と入力し、ソース・エディタにコードのヒントを呼び出すことができます。

    tryとcatchを追加するためのコードのヒント

    この段階では次のようになっているはずです[図をクリックして拡大]。

    instrument_anagram1: initManagement()の追加
  5. ここで、JMXモジュールMBean登録ウィザードを使用して、MBean登録コードをinitManagement()メソッドに追加します。

    Anagrams.javaソース・エディタ・ウィンドウで、initManagement()メソッド本体を右クリックし、「JMX」サブメニュー、「MBean登録の生成」アクションの順に選択します。表示された「MBeanのインスタンス化と登録」パネルで、「既存のMBeanの登録」ラジオ・ボタンを選択されたままにし、「参照」ボタンをクリックします。「参照」パネルで「AnagramsStats」MBeanクラスを選択し、「OK」をクリックします。表示は次のようになります。

    create_mbean_registration: MBean登録コードの生成

    自動的に指定されたMBeanオブジェクト名とコンストラクタを変更する必要はありません。「OK」をクリックすると、initManagement()メソッド本体にMBean登録コードが生成されます。


    MBeanの命名のベスト・プラクティス

    • MBeanに命名する際、オブジェクト名に"type="キーを使用します。このキーの値は、MBeanクラス(ここでは、AnagramsStats)です。
    • シングルトンMBean(アプリケーション内に1つのインスタンスを持つMBean)の場合、命名目的ではこの一意キーで十分です。
    • 多くのドメイン名を作成しないようにします。アプリケーションJavaパッケージ名を使用します。デフォルトのドメイン名を使用することもできます。ObjectName ":"セパレータの前にドメインを指定しないと、暗黙的にデフォルトのドメインが参照されます。

    ベスト・プラクティスを適用すると、MBeanの命名方法がより正式なものになります。

    前述の場合にデフォルトで作成されるObjectNameは、com.toy.anagrams.mbeans:type=AnagramsStatsです。



    このチュートリアルのコンテキストでは、追加の手順が必要です。アプリケーションで管理インタフェースを実装するクラス(AnagramsStats)にアクセスします。これは一般的なルールではありませんが、アプリケーションでMBeanにデータをプッシュする必要がある場合に有用です。ここでは、startThinking()stopThinking()およびsetCurrentAnagram()メソッドは管理メソッドではありませんが、イベントが発生したことをMBeanに通知するためにAnagrams Gameアプリケーションによって使用されます。すると、MBeanが状態を更新します。AnagramsStatsAnagrams UIクラスからアクセスできるようにするには、AnagramsStats MBeanのインスタンスへの直接参照を保持するためのAnagramsクラスが必要です。

    したがって、Anagrams.javaファイルのコードに次の変更を行う必要があります。

  6. 次のプライベート・フィールドをAnagramsクラスに追加します。
        // Reference to the AnagramsStats MBean
        private AnagramsStats mbean;
        
  7. 生成されたMBean登録コードを次のように変更して、initManagement()メソッド内のAnagramsStats MBeanへの参照を初期化します。
    private void initManagement() throws Exception {
        try { // Register MBean in Platform MBeanServer
             mbean = new AnagramsStats();
             ManagementFactory.getPlatformMBeanServer().
                    registerMBean(mbean,
                    new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
        } catch (JMException ex) {
            ex.printStackTrace();
    }
  8. AnagramsStats MBeanの状態を初期化します。Anagrams Gameアプリケーションが起動されると、アナグラムがすぐに表示されます。MBeanにアナグラム文字列値を渡し、思考時間の計算を開始する必要があります。次の行をコピーしてinitManagement()メソッドの最後に貼り付けます。
           // When the Anagrams game is first displayed, a word is proposed to the user.
           // We must start time computing and set the current anagram
           mbean.startThinking();
           mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
          

    この段階では次のようになっているはずです[図をクリックして拡大]。

    instrument_anagram1: initManagement()の追加

    ユーザーのアナグラムの解答の実績を追跡するコードを追加する必要があります。

  9. nextTrialActionPerformed()メソッドを見つけて、次のコードをnextTrialActionPerformed()メソッドの最後に貼り付けます。
        //Update management statistics and values
        try {
            mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
            mbean.startThinking();
            } catch (Exception e) {e.printStackTrace();}

    新しいアナグラムがユーザーに表示されるたびに、MBeanにそのアナグラムが示され、ユーザーの思考時間のカウントを開始するよう指示されます。

  10. guessedWordActionPerformed()メソッドを見つけ、次の行をコードに追加します。変更を保存します。
        //Update management stats
        try {
            mbean.stopThinking();
        } catch(Exception e) {e.printStackTrace();}

    アナグラムが正しく解かれるたびに、MBeanでstopThinking()メソッドがコールされます。

    エディタの表示は次のようになります[図をクリックして拡大]。

    instrument_anagram3: MBeanのメソッドのコール

これで、JMX管理レイヤーとアプリケーション・レイヤーのリンクが終了しました。次の項では、Anagrams Gameアプリケーションをビルドして実行し、公開された管理情報をJConsole GUIを介して確認します。

課題6: JConsoleを使用したアプリケーションの実行

この課題では、プロジェクトをビルドおよび実行し、JConsoleに接続してJVMの状態とアプリケーションのMBeanを視覚化する方法を学習します。

次の手順を実行して、アプリケーションを実行し、管理情報を表示します。

  1. 1つの手順でこれらの3つのタスクを実行します。ツールバーの「モニタリングと管理付きでメイン・プロジェクトを実行」ボタン(ツールバー内の、モニタリングおよび管理によるメイン・プロジェクトの実行のボタン)をクリックします。

    メイン・メニューの「実行」メニューからアクションを起動することもできます。

    注意:アプリケーションを初めてビルドして実行する場合、build.xmlファイルが更新されることを示す警告ダイアログが表示されます。ダイアログで「OK」をクリックします。

    警告ダイアログのスクリーンショット

    「出力」ウィンドウで実行を追跡できます。

    「出力」ウィンドウのスクリーンショット

    IDEでAnagramゲームがビルドされて起動され、自動的にJConsoleウィンドウが開きます。

    Anagram Gameのスクリーンショット

    注意:コンソールからアナグラム・ゲーム・プロセスに接続しようとすると、Java Monitoring & Management Consoleに「接続に失敗しました。」という警告が表示されることがあります。このチュートリアルでは、接続の認証を求めるメッセージが表示されたら、「非セキュア」をクリックできます。

  2. JConsoleウィンドウで「MBeans」タブを選択します。
  3. 左ペインのツリー・レイアウトで、com.toy.anagrams.mbeansの下のノードをすべて展開します。
    AnagramsStatsノードを表示した「MBeans」タブのスクリーンショット
  4. 「通知」ノードを選択し、下にある「サブスクライブ」ボタンをクリックして、アナグラムが解決されるたびにJConsoleが新規通知を受け取れるようにします。
  5. 「Anagrams Game」ウィンドウで最初の3、4個のアナグラムを解きます。

    アナグラムの解答(abstraction、ambiguous、arithmetic、backslash、...)は、WordLibraryクラスに含まれます。

  6. JConsoleウィンドウで、解答のたびに通知を受信していることを確認します。
    AnagramsStatsノードを表示した「MBeans」タブのスクリーンショット
  7. 「属性」ノードをクリックし、属性値が更新されていることを確認します。
    AnagramsStatsノードを表示した「MBeans」タブのスクリーンショット

    JConsoleインタフェースとAnagrams Gameを試すことができます。たとえば、管理操作resetAll()を起動すると、MBeanの属性値が0にリセットされることがわかります。

これで終了です。よくできました。おめでとうございます。


関連項目

詳細は、次を参照してください:

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2015, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo