blob: d83d88620a38896b8d86b7db412ce36f40476a24 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>NetBeans IDEでのJavaアプリケーションへのJava Management Extensions (JMX)インストゥルメントの追加</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta name="description" content="Anagram Game JMX instrumentation tutorial for the NetBeans JMX Wizard module">
<link rel="stylesheet" href="../../../netbeans.css">
<meta name="TOPIC" content="ADVANCED">
<meta name="TYPE" content="ARTICLE">
<meta name="AUDIENCE" content="NBUSER">
<meta name="author" content="Jean-Francois DENISE">
<meta name="author" content="Joel FERAUD">
<meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION, JMX">
<meta name="description" content="An tutorial on how to add JMX management to an application in NetBeans IDE"/>
</head>
<body>
<h1>JavaアプリケーションへのJava Management Extensions (JMX)インストゥルメントの追加</h1>
<center><b>予想される所要時間: 60分</b></center>
<p>NetBeans JMXウィザード・モジュールは、NetBeans IDEでJMXテクノロジとワークフローを統合します。このモジュールを使用すると、管理アプリケーションの迅速な開発、既存アプリケーションへの管理の追加、マネージャ・アプリケーションの開発、仮想マシンの状態のモニターが可能になります。</p>
<p>このチュートリアルでは、既存のアプリケーション(NetBeansサンプルAnagrams Gameアプリケーション)に管理を追加する方法を示します。まず、非管理可能Anagram Javaプロジェクトを作成します。JMXウィザードを使用して管理の90%を生成します。次に、アプリケーションに固有の管理動作を実装します。最後に、JConsoleでプロジェクトの実行/デバッグを使用して、Anagram MBeanを視覚化します。 </p>
<h3>チュートリアルの課題</h3>
<img alt="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます">
<ul>
<li><a href="#Exercise_1">課題1: NetBeansサンプルAnagram Gameプロジェクトの作成</a></li>
<li><a href="#Exercise_2">課題2: AnagramsStats JMX標準MBeanとその管理インタフェースの作成</a></li>
<li><a href="#Exercise_3">課題3: AnagramsStats JMX標準MBeanへの属性、操作および通知の追加</a></li>
<li><a href="#Exercise_4">課題4: AnagramsStats JMX標準MBeanへの実装コードの追加</a></li>
<li><a href="#Exercise_5">課題5: 管理とアプリケーションの接続</a></li>
<li><a href="#Exercise_6">課題6: JConsoleを使用したAnagram Gameの実行</a></li>
</ul>
<h3>前提条件</h3>
<p>このチュートリアルは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。 </p>
<ul>
<li>JMXテクノロジ: <a href="http://download.oracle.com/javase/6/docs/technotes/guides/jmx/index.html">JMXオンライン・ドキュメント</a></li>
<li>Javaテクノロジ: <a href="http://www.oracle.com/technetwork/java/javase/tech/index.html">Java SEテクノロジ早見表</a></li>
<li>NetBeans IDE</li>
</ul>
<p><a href="http://download.oracle.com/javase/6/docs/technotes/guides/management/index.html">Javaプラットフォームのモニタリングおよび管理</a>の内容が参考になる場合もあります。</p>
<h3>チュートリアルに必要なソフトウェア</h3>
<p>このチュートリアルでは、コンピュータに次のソフトウェアをインストールしておく必要があります。</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">ソフトウェアまたはリソース</th>
<th class="tblheader" scope="col">必須バージョン</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.2、7.3、7.4、8.0、Javaバージョン</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">バージョン7または8</td>
</tr>
<tr>
<td class="tbltd1">JMXプラグイン</td>
<td class="tbltd1">NetBeans更新センターから入手可能</td>
</tr>
<tr>
<td class="tbltd1">JConsoleプラグイン</td>
<td class="tbltd1">NetBeans更新センターから入手可能</td>
</tr>
</tbody>
</table>
<p><strong>JMX</strong>および<strong>JConsole</strong>のプラグインをインストールするには、「ツール」>「プラグイン」を選択し、NetBeansアップデート・センターからモジュールをダウンロードします。</p>
<h3>リソース</h3>
<ul>
<li>NetBeansヘルプ・コンテンツ(「ヘルプ」>「ヘルプの目次」>「JMX」)。このヘルプはウィザードからも利用できます。</li>
</ul>
<h2><a name="Exercise_1"></a>課題1: NetBeansサンプルAnagram Gameプロジェクトの作成</h2>
<p>この課題の目標は、実行可能なJavaプロジェクトを作成することです。Anagramゲームは、単語内の文字を並べ替えてユーザーに表示し、ユーザーがアナグラムを解くのを待つSwingアプリケーションです。 </p>
<ol>
<li>「ファイル」>「新規プロジェクト」([Ctrl]-[Shift]-[N])を選択します。</li>
<li>「サンプル」>「Java」カテゴリを選択します。</li>
<li>Anagram Gameプロジェクトを選択します。「次」をクリックします。</li>
<li>「プロジェクトの名前と場所」パネルでプロジェクトの場所を設定するか、デフォルト値で問題なければそのままにします。「メイン・プロジェクトとして設定」チェックボックスが選択されていない場合は選択します。これによって、後続の処理が簡単になります。「終了」をクリックします。
<p>「終了」をクリックすると、IDEによってAnagram Gameプロジェクトが作成され、そのプロジェクトが「プロジェクト」ウィンドウに表示されます。</p>
</li>
<li>AnagramGameプロジェクトを右クリックし、「プロパティ」を選択します。</li>
<li>「ソース」カテゴリを選択し、「ソース/バイナリ形式」がJDK 7またはJDK 8に設定されていることを確認します。「OK」をクリックします。
<p class="notes"><strong>注意:</strong>「JDK 7」または「JDK 8」を選択するには、AnagramGameプロジェクトのJavaプラットフォームもそれぞれJDK 7またはJDK 8以上である必要があります。AnagramGameのJavaプラットフォームは、「プロパティ」ウィンドウの「ライブラリ」カテゴリで変更できます。</li>
<li>Anagram Gameプロジェクト・ノードを右クリックし、「実行」を選択します。</li>
</ol>
<p>「実行」をクリックすると、IDEによってAnagram Gameアプリケーションがビルドおよび起動されます。</p>
<h2><a name="Exercise_2"></a>課題2: AnagramsStats JMX標準MBeanとその管理インタフェースの作成</h2>
<p>この課題の目標は、実装クラスと管理インタフェースで構成されるスケルトンJMX標準MBeanを作成することです。</p>
<p>次の手順を実行して、JMX標準MBeanを作成します。</p>
<ol>
<li>Anagram Gameプロジェクトがメイン・プロジェクトとして設定されていることを確認します。 </li>
<li>「ファイル」>「新規ファイル」([Ctrl]-[N])を選択します。</li>
<li>「JMX」カテゴリから、「標準MBean」を選択します。「次」をクリックします。<br/><img alt="新規ファイル・ウィザードの標準MBeanファイル・タイプのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newfile.png" title="新規ファイル・ウィザードの標準MBeanファイル・タイプ" /></li>
<li>「名前と場所」パネルで次の情報を入力します。
<ul>
<li>クラス名: <tt>AnagramsStats</tt></li>
<li>場所: ソース・パッケージ(デフォルト)</li>
<li>パッケージ: <tt>com.toy.anagrams.mbeans</tt></li>
<li>説明: <tt>Monitoring and Management of the Anagrams Game</tt></li>
</ul>
<br clear="all" /> <img alt="create_mbean2: 新しい標準MBeanの作成、手順2" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newmbean.png" />
</li>
<li>「終了」をクリックします。</li>
</ol>
<p>「終了」をクリックすると、<tt>AnagramsStats</tt> MBeanクラスおよび<tt>AnagramsStatsMBean</tt> MBeanインタフェースがAnagramGameプロジェクトの<tt>com.toy.anagrams.mbeans</tt>パッケージに作成されます。これらは、次の課題で移入されるの空のスケルトンです。</p>
<h2><a name="Exercise_3"></a>課題3: AnagramsStats JMX標準MBeanへの属性、操作および通知の追加</h2>
<p>この課題の目標は、ユーザーが新しいアナグラムを解くのにかかった時間をモニターし、アナグラムが解かれるたびにJMX通知が送信されるよう、生成されたMBeanスケルトンに移入することです。 </p>
<p>MBeanには、次が含まれます。 </p>
<ul>
<li><tt>LastThinkingTime</tt>および<tt>NumResolvedAnagrams</tt>という名前の2つの属性 </li>
<li><tt>resetAll</tt>という名前の操作。 </li>
<li>タイプ<tt>AttributeChangeNotification</tt>の通知。この通知は<tt>LastThinkingTime</tt>が更新されると送信されます。</li>
</ul>
<p>次の手順を実行して、MBeanスケルトンに移入します。</p>
<ol>
<li>NetBeansエディタで<tt>AnagramsStats.java</tt> MBean実装ファイルを開きます。</li>
<li>ソース・エディタで右クリックし、ポップアップ・メニューで<strong>「JMX」>「MBean属性の追加」</strong>を選択します。 </li>
<li>「属性の追加」ボタンをクリックして次の情報を指定し、<tt>LastThinkingTime</tt>属性を追加します。
<ul>
<li>属性名: <tt>LastThinkingTime</tt></li>
<li>型: int</li>
<li>アクセス: 読取り専用</li>
<li>説明: <tt>Elapsed time to solve last anagram</tt></li>
</ul>
<p class="notes"><strong>注意:</strong>まだ「OK」をクリックしないでください。</p>
</li>
<li>「属性の追加」を再度クリックし、次の<tt>NumSolvedAnagrams</tt>属性を追加します。「OK」をクリックします。
<ul>
<li>属性名: <tt>NumSolvedAnagrams</tt></li>
<li>型: int</li>
<li>アクセス: 読取り専用</li>
<li>説明: <tt>Number of solved anagrams</tt></li>
</ul>
<br /> <img alt="create_mbean7: LastThinkingTime属性の追加" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-addattribute.png" />
<p>読取り専用の<tt>LastThinkingTime</tt>および<tt>NumSolvedAnagrams</tt>属性を公開するために必要なコードが、<tt>AnagramsStats</tt> MBeanクラスとそのインタフェースの両方に生成されます。</p>
<p>プライベート・フィールド宣言およびパブリック取得メソッドを確認できます。正確には、メンバー・ビューおよび生成されたコードを確認すると、<tt>getLastThinkingTime</tt>および<tt>getNumSolvedAnagrams</tt>メソッドが<tt>AnagramsStats</tt>クラスとその<tt>AnagramsStatsMBean</tt>インタフェースの両方に生成されていることが確認できます。<tt>int</tt>型のプライベート・フィールド<tt>lastThinkingTime</tt>および<tt>numSolvedAnagrams</tt>も生成されており、実際の属性値の格納に使用されます。</p>
<p>次に、ユーザーが解答までにかかった最小と最大の思考時間および現在ユーザーに表示されているアナグラムを追跡するために、属性をさらに3個追加します。 </p>
</li>
<li>ソース・エディタで右クリックし、ポップアップ・メニューで<strong>「JMX」>「MBean属性の追加」</strong>を選択します。</li>
<li>「属性の追加」ボタンをクリックし、次の属性を追加します。
<table border="1" cellpadding="1">
<thead>
<tr>
<th>属性名</th>
<th></th>
<th>アクセス</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>MinThinkingTime</td>
<td>int</td>
<td>読取り専用</td>
<td>アナグラムを解くのにかかった最小時間</td>
</tr>
<tr>
<td>MaxThinkingTime</td>
<td>int</td>
<td>読取り専用</td>
<td>アナグラムを解くのにかかった最大時間</td>
</tr>
<tr>
<td>CurrentAnagram</td>
<td>文字列</td>
<td>読取り専用</td>
<td>現在解いているアナグラム</td>
</tr>
</tbody>
</table>
<p>ダイアログ・ボックスは次のイメージのような表示になります。</p>
<img alt="さらに3個の属性を追加した後の「属性の追加」ダイアログのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-addattribute2.png" title="さらに3個の属性を追加した後の「属性の追加」ダイアログ" />
<p class="notes"><strong>注意:</strong>作成した属性がダイアログ・ボックスにリストされていることに注意してください。</p>
</li>
<li>「OK」をクリックして変更内容を保存します。</li>
<li>ソース・エディタで右クリックし、ポップアップ・メニューで<strong>「JMX」>「MBean操作の追加」</strong>を選択します。</li>
<li>「操作の追加」をクリックし、<tt>resetAll()</tt>操作を追加して次の詳細を指定します。「OK」をクリックします。
<ul>
<li>操作名: <tt>resetAll</tt></li>
<li>戻り型: <tt>void</tt></li>
<li>パラメータ: (空のままにします)</li>
<li>例外: (空のままにします)</li>
<li>説明: <tt>Reset MBean state</tt></li>
</ul>
<br /> <img alt="「操作の追加」ダイアログのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-addoperation.png" title="「操作の追加」ダイアログでのresetAll操作の追加" />
<p>「OK」をクリックすると、<tt>resetAll</tt>操作を公開するために必要なコードが<tt>AnagramsStats</tt> MBeanクラスとそのインタフェースの両方に生成されていることが確認できます。 </p>
</li>
<li>ソース・エディタで右クリックし、ポップアップ・メニューで<strong>「JMX」>「NotificationEmitterインタフェースの実装」</strong>を選択します。</li>
<li>「NotificationEmitterインタフェースの実装」ダイアログで次の詳細を指定します。
<ul>
<li><strong>「ブロードキャスタへの委任の生成」を選択します。</strong><tt>NotificationEmitter</tt>インタフェースによって宣言されているすべてのメソッドは、通知ブロードキャスタに委任することで実装されます。通知ブロードキャスタは、MBeanが通知を送信する方法を簡略化します。</li>
<li><strong>「プライベート順序番号とアクセッサの生成」を選択します。</strong>送信される各通知に追加される一意の順序番号値を処理するためのコードが生成されます。</li>
<li><strong>「通知の追加」をクリックします。</strong>通知表で次の詳細を指定します。
<ul>
<li>通知クラス: <tt>javax.management.AttributeChangeNotification</tt></li>
<li>通知タイプ: (自動的に<tt>ATTRIBUTE_CHANGE</tt>に設定されます)</li>
<li>説明: <tt>Anagram is Solved</tt><br></li>
</ul>
</li>
</ul>
<br /> <img alt="「NotificationEmitterの実装」ダイアログのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-changenotification.png" title="「NotificationEmitterの実装」ダイアログでの変更通知の追加" />
<p>「OK」をクリックします。</p>
<p><tt>NotificationEmitter</tt>インタフェースを実装するために必要なコードが<tt>AnagramsStats</tt> MBeanクラスに生成されていることが確認できます。生成された実装によって通知の処理が<tt>NotificationBroadcasterSupport</tt>クラスに委任されたことが確認できます。</p>
</li>
<li>変更を保存します。</li>
</ol>
<p>この課題では、JMXウィザード・モジュールを使用して、属性、操作および通知の送信をMBeanに追加する方法を学習しました。これで、管理情報を公開するために必要なインフラストラクチャをMBeanに移入するために必要な手順が終了しました。<tt>AnagramsStats</tt> MBeanクラスの実装に内部ロジックを追加し、MBeanとAnagram Gameアプリケーションの間にブリッジを作成する必要があります。</p>
<h2><a name="Exercise_4"></a>課題4: AnagramsStats JMX標準MBeanへの実装コードの追加</h2>
<p>この課題では、<tt>AnagramsStats</tt> MBeanクラスの実装に内部ロジックを追加します。 </p>
<p>次の手順を実行して、実装コードを追加します。</p>
<ol>
<li>属性にはすでにプライベート・フィールドが宣言されており、取得メソッドには何も追加する必要がありません。</li>
<li><tt>resetAll()</tt> メソッドを実装する必要があります。生成された本体は空です。<tt>resetAll()</tt>がコールされたら、単にすべてのカウンタを0に設定します。次(太字部分)のコード行を<tt>resetAll()</tt>メソッド本体に追加します。
<pre>public void resetAll() {
<strong>minThinkingTime = 0;
maxThinkingTime = 0;
lastThinkingTime = 0;
numSolvedAnagrams = 0;</strong>
}</pre>
</li>
<li>次の処理を行う実装コードも追加する必要があります。
<ul>
<li>ユーザーが最後のアナグラムを解くのにかかった思考時間の計算</li>
<li>最小および最大の思考時間の計算</li>
<li>解かれたアナグラムのカウンタの増分</li>
<li>現在のアナグラムの把握</li>
<li>アナグラムが解かれた時の通知の作成と送信</li>
</ul>
<p>その目的で、最後のアナグラムがユーザーに表示された時間を格納するためのプライベート・フィールド<tt>startTime</tt>、前述の操作を実行するための<tt>startThinking()</tt>および<tt>stopThinking()</tt>の2つのメソッドおよび<tt>setCurrentAnagram()</tt>メソッドを追加します。</p>
<p>次のコードを<tt>AnagramsStats.java</tt>(たとえば、クラスの実装の最後など)に追加します。
<pre class="examplecode">
/*
* 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;
}</pre>
<p><tt>startThinking()</tt><tt>stopThinking()</tt>および<tt>setCurrentAnagram()</tt>の3つのメソッドは<tt>AnagramsStatsMBean</tt>インタフェースで宣言されていないため、MBean管理インタフェースの一部ではないことに注意してください。ただし、アナグラムがユーザーに表示された時間、アナグラムが解かれた時間および現在のアナグラムをMBeanに示すためにAnagram Gameアプリケーションによってコールされるため、パブリックです。つまり、アプリケーションとMBeanの間のブリッジという必須部分です。</p>
<p>アナグラムが解かれるたびに<tt>ATTRIBUTE_CHANGE</tt>タイプのJMX通知が送信されることにも注意してください。 </p>
</li>
</ol>
<p>これで、MBeanの実装が終了しました。この項では、次の処理を可能にするためのコードおよびメソッドを追加しました。</p>
<ul>
<li>内部MBean状態の更新</li>
<li>アプリケーションからのコール</li>
<li>JMX通知の送信</li>
</ul>
<a name="Exercise_5"></a>
<h2>課題5: 管理とアプリケーションの接続</h2>
<p>この課題では、MBeanにアクセスして管理情報を渡すためのコードをAnagram Gameアプリケーションに追加します。</p>
<p>次の手順を実行します。</p>
<ol>
<li>エディタで<tt>Anagrams.java</tt>を開きます。
<p><tt>com.toy.anagrams.ui</tt>パッケージの<tt>Anagrams</tt>クラスは、Anagram Gameアプリケーションの<tt>main</tt>クラスです。<tt>Anagrams</tt>クラスはユーザー・インタフェース・クラスでもあるため、ファイルはエディタの「デザイン」ビューで開きます。</p></li>
<li>エディタ・ウィンドウの上部にある「ソース」ボタンをクリックして、「ソース」ビューでクラスを編集します。</li>
<li>次の空の<tt>initManagement()</tt>プライベート・メソッドを<tt>Anagrams</tt>クラス(<tt>Anagrams</tt>コンストラクタの後)に追加します。
<pre>
/**
* JMX initialization:
* Create and register Anagrams MBean in Platform MBeanServer.
* Initialize thinking time and current anagram.
*/
private void initManagement() throws Exception {
}</pre>
</li>
<li>次の<tt>initManagement()</tt>メソッドへのコールを<tt>Anagrams</tt>クラス・コンストラクタの最後、コンストラクタの終わりを表す終了の波括弧の前に追加します。
<pre>
//JMX Management initialization
initManagement();
</pre>
<p>また、コンパイルするには、<tt>throws Exception</tt>句を<tt>Anagrams()</tt>コンストラクタに追加し、<tt>Main()</tt>メソッド内の<tt>new Anagrams().setVisible(true);</tt>文をtryとcatchで囲む必要があります。エディタの左マージンに提案グリフが表示されます。コードの行に挿入カーソルを置いて「Alt-Enter」と入力し、ソース・エディタにコードのヒントを呼び出すことができます。</p>
<img alt="tryとcatchを追加するためのコードのヒント" class="margin-around b-all" src="../../../images_www/articles/80/java/jmx/jmx-initmanagement-try.png" title="tryとcatchを追加するためのコードのヒント">
<p>この段階では次のようになっているはずです[図をクリックして拡大]。</p>
<a href="../../../images_www/articles/80/java/jmx/jmx-initmanagement.png" title="Instrument Anagram 1 - クリックして拡大"><img alt="instrument_anagram1: initManagement()の追加" class="margin-around b-all" src="../../../images_www/articles/80/java/jmx/jmx-initmanagement-sm.png"></a>
</li>
<li>ここで、JMXモジュールMBean登録ウィザードを使用して、MBean登録コードを<tt>initManagement()</tt>メソッドに追加します。
<p><tt>Anagrams.java</tt>ソース・エディタ・ウィンドウで、<tt>initManagement()</tt>メソッド本体<strong></strong>を右クリックし、「JMX」サブメニュー、「MBean登録の生成」アクションの順に選択します。表示された「MBeanのインスタンス化と登録」パネルで、「既存のMBeanの登録」ラジオ・ボタンを選択されたままにし、「参照」ボタンをクリックします。「参照」パネルで「<tt>AnagramsStats</tt>」MBeanクラスを選択し、「OK」をクリックします。表示は次のようになります。</p>
<img alt="create_mbean_registration: MBean登録コードの生成" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-registermbeandialog.png">
<p>自動的に指定されたMBeanオブジェクト名とコンストラクタを変更する必要はありません。「OK」をクリックすると、<tt>initManagement()</tt>メソッド本体にMBean登録コードが生成されます。</p>
<hr style="width: 100%; height: 2px;" />
<h3>MBeanの命名のベスト・プラクティス</h3>
<ul>
<li>MBeanに命名する際、オブジェクト名に"<tt>type=</tt>"キーを使用します。このキーの値は、MBeanクラス(ここでは、<tt>AnagramsStats</tt>)です。
</li>
<li>シングルトンMBean(アプリケーション内に1つのインスタンスを持つMBean)の場合、命名目的ではこの一意キーで十分です。
</li>
<li>多くのドメイン名を作成しないようにします。アプリケーションJavaパッケージ名を使用します。デフォルトのドメイン名を使用することもできます。<tt>ObjectName</tt> "<tt>:</tt>"セパレータの前にドメインを指定しないと、暗黙的にデフォルトのドメインが参照されます。 </li>
</ul>
<p>ベスト・プラクティスを適用すると、MBeanの命名方法がより正式なものになります。</p>
<p>前述の場合にデフォルトで作成される<tt>ObjectName</tt>は、<tt>com.toy.anagrams.mbeans:type=AnagramsStats</tt>です。</p>
<hr style="width: 100%; height: 2px;"><br>
<p>このチュートリアルのコンテキストでは、追加の手順が必要です。アプリケーションで管理インタフェースを実装するクラス(<tt>AnagramsStats</tt>)にアクセスします。これは一般的なルールではありませんが、アプリケーションでMBeanにデータをプッシュする必要がある場合に有用です。ここでは、<tt>startThinking()</tt><tt>stopThinking()</tt>および<tt>setCurrentAnagram()</tt>メソッドは管理メソッドではありませんが、イベントが発生したことをMBeanに通知するためにAnagrams Gameアプリケーションによって使用されます。すると、MBeanが状態を更新します。<tt>AnagramsStats</tt><tt>Anagrams</tt> UIクラスからアクセスできるようにするには、<tt>AnagramsStats</tt> MBeanのインスタンスへの直接参照を保持するための<tt>Anagrams</tt>クラスが必要です。</p>
<p>したがって、<tt>Anagrams.java</tt>ファイルのコードに次の変更を行う必要があります。</p>
</li>
<li>次のプライベート・フィールドを<tt>Anagrams</tt>クラスに追加します。
<pre>
// Reference to the AnagramsStats MBean
private AnagramsStats mbean;
</pre>
</li>
<li>生成されたMBean登録コードを次のように変更して、<tt>initManagement()</tt>メソッド内の<tt>AnagramsStats</tt> MBeanへの参照を初期化します。
<pre>private void initManagement() throws Exception {
try { // Register MBean in Platform MBeanServer
<strong>mbean = new AnagramsStats();</strong>
ManagementFactory.getPlatformMBeanServer().
registerMBean(<strong>mbean</strong>,
new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
} catch (JMException ex) {
<strong>ex.printStackTrace();</strong>
}</pre>
</li>
<li><tt>AnagramsStats</tt> MBeanの状態を初期化します。Anagrams Gameアプリケーションが起動されると、アナグラムがすぐに表示されます。MBeanにアナグラム文字列値を渡し、思考時間の計算を開始する必要があります。次の行をコピーして<tt>initManagement()</tt>メソッドの最後に貼り付けます。<br />
<pre>
// 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));
</pre>
<p>この段階では次のようになっているはずです[図をクリックして拡大]。</p>
<a href="../../../images_www/articles/74/java/jmx/jmx-initmanagement2.png" title="Instrument Anagram 2 - クリックして拡大"><img alt="instrument_anagram1: initManagement()の追加" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-initmanagement2-sm.png"></a>
<p>ユーザーのアナグラムの解答の実績を追跡するコードを追加する必要があります。</p>
</li>
<li><tt>nextTrialActionPerformed()</tt>メソッドを見つけて、次のコードを<tt>nextTrialActionPerformed()</tt>メソッドの最後に貼り付けます。
<pre class="examplecode">
//Update management statistics and values
try {
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
mbean.startThinking();
} catch (Exception e) {e.printStackTrace();}</pre>
<p>新しいアナグラムがユーザーに表示されるたびに、MBeanにそのアナグラムが示され、ユーザーの思考時間のカウントを開始するよう指示されます。</p>
</li>
<li><tt>guessedWordActionPerformed()</tt>メソッドを見つけ、次の行をコードに追加します。変更を保存します。
<pre class="examplecode">
//Update management stats
try {
mbean.stopThinking();
} catch(Exception e) {e.printStackTrace();}</pre>
<p>アナグラムが正しく解かれるたびに、MBeanで<tt>stopThinking()</tt>メソッドがコールされます。</p>
<p>エディタの表示は次のようになります[図をクリックして拡大]。</p>
<a href="../../../images_www/articles/74/java/jmx/jmx-stopthinking.png" title="Instrument Anagram 3 - クリックして拡大"><img alt="instrument_anagram3: MBeanのメソッドのコール" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-stopthinking-sm.png"></a>
</li>
</ol>
<p>これで、JMX管理レイヤーとアプリケーション・レイヤーのリンクが終了しました。次の項では、Anagrams Gameアプリケーションをビルドして実行し、公開された管理情報をJConsole GUIを介して確認します。</p>
<a name="Exercise_6"></a>
<h2>課題6: JConsoleを使用したアプリケーションの実行</h2>
<p>この課題では、プロジェクトをビルドおよび実行し、JConsoleに接続してJVMの状態とアプリケーションのMBeanを視覚化する方法を学習します。 </p>
<p>次の手順を実行して、アプリケーションを実行し、管理情報を表示します。</p>
<ol>
<li>1つの手順でこれらの3つのタスクを実行します。ツールバーの「モニタリングと管理付きでメイン・プロジェクトを実行」ボタン(<img alt="ツールバー内の、モニタリングおよび管理によるメイン・プロジェクトの実行のボタン" src="../../../images_www/articles/74/java/jmx/run-project24.png" title="モニタリングおよび管理によるメイン・プロジェクトの実行のボタン" />)をクリックします。
<p class="tips">メイン・メニューの「実行」メニューからアクションを起動することもできます。</p>
<p class="notes"><strong>注意:</strong>アプリケーションを初めてビルドして実行する場合、<tt>build.xml</tt>ファイルが更新されることを示す警告ダイアログが表示されます。ダイアログで「OK」をクリックします。</p>
<img alt="警告ダイアログのスクリーンショット" class="margin-around" src="../../../images_www/articles/74/java/jmx/jmx-firsttime.png" title="初めてアプリケーションをモニタリングする場合の警告ダイアログ" />
<p>「出力」ウィンドウで実行を追跡できます。</p>
<img alt="「出力」ウィンドウのスクリーンショット" class="margin-around" src="../../../images_www/articles/74/java/jmx/jmx-compiling.png" title="処理を表示している「出力」ウィンドウ" />
<p>IDEでAnagramゲームがビルドされて起動され、自動的にJConsoleウィンドウが開きます。</p>
<img alt="Anagram Gameのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-anagram.png" title="アナグラム・ゲーム" />
<p class="notes"><strong>注意:</strong>コンソールからアナグラム・ゲーム・プロセスに接続しようとすると、Java Monitoring &amp; Management Consoleに「接続に失敗しました。」という警告が表示されることがあります。このチュートリアルでは、接続の認証を求めるメッセージが表示されたら、「非セキュア」をクリックできます。</p>
</li>
<li>JConsoleウィンドウで「MBeans」タブを選択します。</li>
<li>左ペインのツリー・レイアウトで、<tt>com.toy.anagrams.mbeans</tt>の下のノードをすべて展開します。<br /> <img alt="AnagramsStatsノードを表示した「MBeans」タブのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans1.png" title="AnagramsStatsノードを表示した「MBeans」タブ" />
</li>
<li>「通知」ノードを選択し、下にある「サブスクライブ」ボタンをクリックして、アナグラムが解決されるたびにJConsoleが新規通知を受け取れるようにします。</li>
<li>「Anagrams Game」ウィンドウで最初の3、4個のアナグラムを解きます。
<p class="tips">アナグラムの解答(abstraction、ambiguous、arithmetic、backslash、...)は、<tt>WordLibrary</tt>クラスに含まれます。</p></li>
<li>JConsoleウィンドウで、解答のたびに通知を受信していることを確認します。<br /> <a href="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans2.png" title="クリックして拡大"> <img alt="AnagramsStatsノードを表示した「MBeans」タブのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans2-sm.png" title="AnagramsStatsノードを表示した「MBeans」タブ" /></a>
</li>
<li>「属性」ノードをクリックし、属性値が更新されていることを確認します。<br /> <img alt="AnagramsStatsノードを表示した「MBeans」タブのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans3.png" title="AnagramsStatsノードを表示した「MBeans」タブ" />
<p>JConsoleインタフェースとAnagrams Gameを試すことができます。たとえば、管理操作<tt>resetAll()</tt>を起動すると、MBeanの属性値が0にリセットされることがわかります。</p></li>
</ol>
<p><strong>これで終了です。よくできました。おめでとうございます。</strong></p>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Adding%20Java%20Management%20Extensions%20(JMX)%20Instrumentation">このチュートリアルに関するご意見をお寄せください</a></div>
<br style="clear:both;">
<h2>関連項目</h2>
<p>詳細は、次を参照してください:</p>
<ul>
<li><a href="jmx-getstart.html">NetBeans IDEでのJMXモニタリングの開始</a></li>
</ul>
</body>
</html>