IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  WebSphere  >

WebSphere eXtreme Scale の xsadmin を機能強化する

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

John Pape, WebSphere Application Server SWAT Team, IBM

2008年 12月 10日

IBM® WebSphere® eXtreme Scale V6.1.0.3 には xsadmin というツールが含まれています。xsadmin は Java™ アプリケーションであり、WebSphere eXtreme Scale のプロセスとやり取りしてグリッド・ランタイムに関する情報 (区画 (シャード: shard) の配置、利用可能なコンテナーなど) を表示します。この記事では xsadmin を機能強化する方法を説明します。xsadmin を機能強化することによって、eXtreme Scale デプロイメントに新機能を追加したり、その使いやすさを向上したりすることができます。
IBM WebSphere 開発者向け技術ジャーナルより。

はじめに

IBM WebSphere eXtreme Scale をデプロイするためには下記の 2 つの方法があります。

  • WebSphere プロファイルを拡張することにより、既存の WebSphere Application Server Network Deployment インスタンスにデプロイする方法。
  • WebSphere Application Server が存在しない J2SE™ 環境にデプロイする方法。

第 1 のシナリオでは、WebSphere Application Server の管理コンポーネントを使うことでシステムのモニタリングとサーバーの管理を実現できますが、スタンドアロン環境の場合も WebSphere に管理される環境の場合も、グリッドの内部についてのビューは xsadmin アプリケーションを使わない限り表示することができません。

xsadmin アプリケーションは WebSphere eXtreme Scale V6.1.0.3 の製品コードの一部ではなく、サンプル・アプリケーションとして含まれています。xsadmin が提供するほとんどすべての機能は、eXtreme Scale プロセスに含まれる JMX™ の MBean インスタンスとのやり取りによって実現されます。

製品出荷時のままの xsadmin を使うと、構成されている複数のコンテナーにおけるグリッドの区画について、プライマリー区画とレプリカ区画の現在の配置を表示することができ、どのコンテナーが利用可能か、またどのホスト上でコンテナーが実行されているかについても表示することができます。この記事では xsadmin に対して以下を行います。

  • コマンドライン引数に関するコードを修正し、必須の引数と必須ではない引数について、より理にかなったフローに改善します。
  • -l 引数が表示されるようにします (-l 引数を使うと、利用可能なグリッド・インスタンスや関連のマップ・セットを容易にブラウズすることができます)。
  • -catserv 引数を追加し、この引数を使って環境の中のカタログ・サーバーに関する情報を表示できるようにします。
  • -cg 引数を追加し、この引数を使って現在のコア・グループのランタイム状態のみの情報、クォーラムの状態を付けた情報、そしてハートビート間隔の設定の情報を表示できるようにします。

xsadmin に変更を加える前に、既に xsadmin に備わっている機能を確認しましょう。




上に戻る


xsadmin サンプル・アプリケーション

この記事では IBM Rational® Software Development プラットフォーム (具体的には IBM Rational Application Developer V7.0.0.7) を使用して xsadmin サンプル・アプリケーションを更新することを前提にしています。xsadmin アプリケーションは簡単な Java アプリケーションであるため、任意の IDE を使用して xsadmin を更新することができます。ただし、WebSphere eXtreme Scale V6.1.0.3 の objectgrid.jar ファイルを IDE に組み込む必要があります (このファイルにはコンパイル時に必要なクラスが含まれており、これらのクラスをビルド・パスに追加しないと、このアプリケーションをコンパイルしたりテストしたりすることができません)。アプリケーションのビルド・パスに objectgrid.jar ファイルを挿入する方法の詳細は、皆さんが使用する開発環境のドキュメントを参照してください。

xsadmin アプリケーションは com.ibm.websphere.samples.objectgrid.admin という名前の 1 つのパッケージで構成されています。このパッケージの中には、JMXProxy と OGAdmin という 2 つのクラス・ファイルが含まれています。ここでは OGAdmin クラスを中心に作業を行います。作業の中で JMXProxy クラスを参照したり利用したりしますが、JMXProxy クラスのソース・コードには触れません。

OGAdmin クラスには以下のような内部クラスが含まれています。

  • Options
  • CmdLineParser
  • Comp

ここでは Options 内部クラスと CmdLineParser 内部クラス、そしてそれらを包含する OGAdmin クラスに焦点を絞ります。

Options クラスは単純な Java Bean として存在しますが、通常の Java Bean に見られる getter メソッドと setter メソッドは持っていません。CmdLineParser は名前どおりのことをします。つまり xsadmin プログラムに渡されるコマンドライン引数を解析します。もっと具体的に言うと、OGAdmin の main() メソッドに渡される引数ストリングを解析します。Options クラスと CmdLineParser クラスの間の「暗黙の了解」として、CmdLineParser ロジックは Options クラスにセットされる可能性のあるすべてのフラグについても把握している必要があります。ここで「暗黙の」という理由は、これが確実に行われるようにするための Java インターフェースが定義されているわけではないからです。

xsadmin が実行されると、以下のとおりになります。

  • すべての引数は OGAdmin クラスの main() メソッドに渡されます。
  • そうすると main メソッドは、引数の解析を CmdLineParser オブジェクトに委譲する処理に進み、それに対し CmdLineParser オブジェクトは Options オブジェクトを返します。
  • 次に、この Options オブジェクトに対し特定の条件による評価が行われ、それによって OGAdmin クラスでどんなロジックを実行するか、またその結果このアプリケーションの呼び出し元のコンソールにどんな出力を表示するかが決まります。
  • 何もオプションを付けずに xsadmin を呼び出した場合、通常は、必要なグリッド・ランタイムの情報を得る上で役立つような、構文に関するヘルプがツールによって出力されます。

では、このサンプル・アプリケーションを機能強化する方法を調べてみることにしましょう。




上に戻る


サンプル・アプリケーションを機能強化する

  1. xsadmin アプリケーションのソース・コードを入手するためには、単純に WebSphere eXtreme Scale インストール環境の OBJECTGRID_HOME\samples ディレクトリーにある xsadmin.jar ファイルを、IBM Rational Application Developer のワークスペースにインポートできる場所へと移動します。このファイルを移動できたら、Rational Application Developer の中で XSAdmin という新しい Java プロジェクトを作成します。次に、xsadmin.jar ファイルをインポートするために Java パースペクティブの Package Explorer ビューの中で XSAdmin プロジェクトを右クリックし、Import を選択します。そうすると図 1 に示すパネルが表示されるはずです。

    図 1. インポート・ソースを選択する


  2. インポート・ソースのリストから Archive File というインポート・タイプを選択し (あるいはツリー・ビューの上にあるフィルター・ボックスに Archive File と入力し)、そして Next をクリックします。そうすると図 2 が表示されるはずです。

    図 2. インポートするアーカイブを選択する


  3. From archive file フィールドの横にある Browse ボタンをクリックし、xsadmin.jar ファイルを選択します(パスがわかっている場合にはファイル名を入力することもできます)。図 2 は xsadmin.jar ファイルへのパスを、「alaric」という別の Windows® マシンへの UNC パスとして表示しています。また、ダイアログ・ボックスの左側にツリー・ビューが展開されているため、このアーカイブのフォルダー構造全体を見ることができます。ツリー・ビューの中にあるディレクトリーをクリックすると、そのディレクトリーに含まれるファイルがダイアログ・ボックスの右側のリスト・ビューに表示されます。Finish をクリックしてインポート操作を終了します。
  4. インポートが完了すると、Package Explorer ビューは図 3 のようになるはずです。

    図 3. インポートが成功した様子


これで xsadmin のサンプル・コードを Rational Application Developer のワークスペースの新しい Java プロジェクトにインポートできたので、ここからは、要件に合うようにコードの変更を行っていきます。




上に戻る


コマンドラインの必須項目を変更する

最初に変更する項目は、コマンドライン引数の解析です。先述のとおり、xsadmin アプリケーションでは常に -g 引数と -m 引数 (それぞれグリッド名とマップ・セット名) が必須となっています。このアプリケーションを呼び出す上で、ほとんどの場合はこのままでよいのですが、この後すぐにわかるように、-l 引数を利用する場合には -g 引数と -m 引数の指定を必須にすべきではありません (-l 引数を利用すると、利用可能なグリッドの一覧と関連するマップ・セットを表示することができ、ブラウズ機能と同等の役割を果たします)。そこで、最初にこれを処理しましょう。-g 引数と -m 引数が必須項目ではなくなるようにロジックを変更するためには、以下の 2 つのステップが必要です。

CmdLineParser クラスのロジックを変更する必要があります。このロジックは parseArguments() メソッドの中に含まれています。変更前のこのコードを示したものがリスト 1 です。


リスト 1. 変更前の parseArguments()
if (options.gridName == null || options.mapsetName == null) {
     this.validate = false;
} else {
     this.validate = true;
}

このロジックをバイパスし、実質的に必ず validate フラグが true にセットされるようにする必要があります。このクラスの最初の方を見ると、validate フラグはデフォルト値が false で初期化されています。このコードをリスト 2 のようにコメントアウトすると、validate フラグが必ず true になります (あるいは、このコードを完全に削除するという選択肢もあります)。


リスト 2. 変更後の parseArguments()
/*
             * Removing these lines in this manner allows for the -g and -m arguments 
		 * to be bypassed, thus allowing bypassed, thus allowing a more logical
             * application of the -l argument like so : xsadmin -l -containers
             */
//            if (options.gridName == null || options.mapsetName == null) {
//                this.validate = false;
//            } else {
                this.validate = true;
//         }




上に戻る


グリッドおよびマップのブラウズ用引数をヘルプに表示させる

-l オプションは xsadmin のヘルプ出力の中に有効なオプションとして明示的に表示されるわけではありませんが、このオプションを使うためのコードは用意されています。上記では parseArguments() メソッドを変更しましたが、この変更を加える前は -g 引数と -m 引数にダミーの値を提供しない限り parseArguments() メソッドを有効に使うことはできませんでした。つまり下記のように実行することはできませんでした。

xsadmin –ch myhost –p 1099 –l

代わりに下記を実行する必要がありました。

xsadmin –ch myhost –p 1099 –g xxx –m xxx -l

.

-l オプションがヘルプ出力に表示されるようにするためには、以下のステップを実行する必要があります。

  1. OGAdmin クラスの main() メソッドのロジックを変更し、単独で -l 引数を使用できるようにします。
  2. この新しいオプションを含めるようにヘルプの内容を変更します。

第 1 のステップのために、main() メソッドの一部を見てみましょう (リスト 3)。


リスト 3. main() メソッドのコード・セグメント
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned)) {
      CmdLineParser.printShowHelp();
      // System.exit(-1);
      return;
}

このコード・セクションはコマンドライン引数から得られたオプションをチェックし、オプションとして -containers、-primaries、-unassigned、-hosts のいずれも見つからない場合には実行を停止します。ここではユーザーが -l 引数を単独で指定できるようにしたいので、このコードを変更し、単独で -l 引数を使えるようにする必要があります。

リスト 4 は main() メソッドへの変更を示しています。既存の if 文に条件が追加され、Option オブジェクト (この例では「o」) の listOG フラグが「true」の場合には printHelp() メソッドを呼び出さないようにしています (printHelp() メソッドのコードはユーザーに対して、引数として -containers、-primaries、-unassigned、-hosts のいずれかを使用するように助言します)。この部分がまさに、今回の目的の動作にあたります。


リスト 4. 変更後の main() のスニペット
/*
* Added !o.listOG to account for the condition of a user wanting to just see the 
* list of grids and associated mapsets - who wants to specify the other options for 
* a listing????
*/
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned) 
	&& !o.listOG) {
   CmdLineParser.printShowHelp();
   // System.exit(-1);
   return;
}

ソース・コードのもう少し下の方を見ると、グリッド名とマップ・セットの出力処理を行うコードがあります (リスト 5)。


リスト 5. グリッドとマップ・セットを出力するためのロジック
if (o.listOG) {
printListOfOG(jmxProxy.getObjectGridNames());
      return;
}

このコードをコンパイルすると、サンプル・テストを実行できるはずです。Rational Application Developer でテストを実行するためには、パネルの最上部にあるツールバーの Run アイコンをクリックし、Run As => Java Application の順に選択します (図 4)。


図 4. アプリケーションを実行する

Select Java Application ダイアログ (図 5) で OGAdmin と入力し、アプリケーションとして使われる mainクラスを指定します。このクラスを選択し、OK をクリックして続行します。


図 5. OGAdmin クラスを選択し、Java アプリケーションとして実行させる

コマンドライン引数を何も指定しなかったため、アプリケーションが実行されるとコンソール・ビューにヘルプの内容が表示されます。その結果はリスト 6 のようなもののはずです。

ヘルプの文字列がまだ変更されていないことに気付くと思います。そこで、この問題を処理しましょう。変更しようとしているヘルプの文字列の元となっているのは CmdLineParser クラスの printHelp() メソッドです。必要なことは、-l 引数とその使用パターンを説明する行を適切な場所に挿入することのみです。リスト 6 は printHelp() メソッドの、このコード行の挿入先となる部分を示しています。追加したコード行は太字で示してあります。


リスト 6. 変更された printHelp() メソッド
static void printHelp() {
            System.out.println("The following arguments are required:");
            System.out.println(" " + gridNameArg + " \'ObjectGrid name\'"); // 1
            System.out.println(" " + mapsetNameArg + " \'Mapset name'"); // 2
            System.out.println(OGAdmin.NL);
            System.out.println("The following arguments are optional");
            
            System.out.println(" " + listOGArg + " \'View a list of available grids 
		and associated mapsets\'");
            System.out.println(" " + jmxHostArg + " \'Catalog service JMX hostname, 
		default value=localhost\'"); // 1
            System.out.println(" " + jmxPortArg + " \'Catalog service JMX port. default: 
		1099 or 9809 for DMGR host\'"); // 2
            System.out.println(" " + dmgrArg + " \'Specify this flag, if connecting to 
		WebSphere DMGR host.\'"); // 14
            System.out.println(OGAdmin.NL);
            System.out.println("The following arguments are required if security is 
		enabled");
            System.out.println(" " + userArg + " \'Username\'");
            System.out.println(" " + passArg + " \'Password\'");// 1
            System.out.println(OGAdmin.NL);

            System.out.println("The following arguments are required if SSL is enabled");
            System.out.println(" " + sslArg + " \'Enables SSL authentication\'");
            System.out.println(" " + trustPathArg + " \'Absolute path to trust store\'");
            System.out.println(" " + trustPassArg + " \'Trust store password\'");
            System.out.println(" " + trustTypeArg + " \'Trust store type\'");
         System.out.println(OGAdmin.NL);

...
<code continues>
...

listOGArg 変数は評価されて -l ストリングになります。これで、ユーザーに -l 引数についてきちんと知らせるヘルプの情報が追加され、また、他の引数なしでも -l 引数を指定できるようになりました。

次に、新しい機能を作成します。ここではクラスター化されたカタログ・サーバーの情報をユーザーに表示できる機能を追加します。




上に戻る


機能を追加する: -catserv

xsadmin サンプル・アプリケーションは区画 (シャード) の配置とサーバーの場所 (つまり、どのホストでサーバーが実行されているか) に関する情報を既に提供していますが、カタログ・サーバーの状態や場所に関する詳細は提供していません。xsadmin ツールを実行するためには、(JMX インターフェースはカタログ・サーバーで実行されるため) カタログ・サーバーのエンドポイントを少なくとも 1 つ知っている必要がありますが、カタログ・サーバー・クラスターを構成する他のカタログ・サーバーの場所は把握していないということがあるかもしれません。これに対応する機能を xsadmin サンプル・アプリケーションに追加します。

第 1 に、カタログ・サーバー・オプションを表現するために使用する新しいフラグを引数に導入する必要があります。この場合はストリング値 -catserv を使います。この変数を Options クラスと CmdLineParser クラスに作成する必要があります。

この変数を Options クラスに追加するためには、このクラスの中に既に定義されているクラス・レベルの変数 (trustType、password、port、showContainers など) のリストに下記の行を単純に追加します。

boolean catServer;

第 2 に、CmdLineParser クラスにもクラス・レベルの変数を宣言し、このオプションを表す実際のストリング値を定義する必要があります。そのためには、CmdLineParser クラスで既に定義されているストリング変数のリストに下記の行を追加します。

final static String catServer = "-catserv";

これで CmdLineParser クラスと Options クラスが新しい引数に対応できるようになったので、この引数を認識して適切なアクションを実行するロジックを OGAdmin クラスに追加する必要があります。

前のセクションで、他の引数なしで -l 引数を渡せるようにするには main() メソッドのロジックを変更する必要があったことを思い出してください。ここでも再度似たことを行い、新しい -catserv 引数を他の引数なしで渡せるようにする必要があります。コードを変更する部分はリスト 4 に示したのと同じです。リスト 7 では新たに追加した部分を太字で示してあります。


リスト 7. 新たに変更された main() メソッド
/*
* Added !o.listOG to account for the condition of a user wanting to just see the 
* list of grids and associated mapsets - who wants to specify the other options 
* for a listing????
*/
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned) && 
	!o.listOG && !o.catServer) {
        CmdLineParser.printHelp();
        // System.exit(-1);
        return;
}

リスト 7 の変更を加えると、コマンドラインで他の引数を何も指定せずに -catserv 引数を渡すことができます。

次に、この引数がアプリケーションに渡されたときに実行されるロジックを少し追加する必要があります。リスト 8 は (OGAdminの) main() メソッドの変更対象部分を示しています。


リスト 8. OGAdminの main() メソッドのロジック
/*
* code that responds to -l argument - prints out grids and mapsets defined!!
*/
if (o.listOG) {
    printListOfOG(jmxProxy.getObjectGridNames());
    return;
}

// Show containers
if (o.showContainers) {
    printContainers(jmxProxy, o);
} else if (o.showPrimaries) {
    printPrimaries(jmxProxy, o);
} else if (o.showUnAssigned) {
    printUnassigned(jmxProxy, o);
} else if (o.showHosts) {
    printHosts(jmxProxy, o);
} else {
    //?
}

リスト 8 の先頭のコードはリスト 5 で説明したコードと同じであり、-l 引数のための機能を提供します。その次の部分は、アプリケーションに -containers、-primaries、-unassigned、-hosts のいずれかが渡されたかどうかを判断し、該当する場合はそれぞれの適切なメソッドに処理させるべく制御を委譲します。そのメソッドではデータを取得してフォーマット設定を行い、コンソールに出力します。-catserv 引数のための リスト 9 のロジックを、リスト 8 のコードのすぐ下に追加します。


リスト 9. -catserv 引数を検出するためのロジック
//show catserver info
if (o.catServer){
printCatalogServers(catalogServerConnection);
}

ここで、「catalogServerConnection」という名前の変数を引数に取る printCatalogServers() という名前のメソッドを呼び出していることに注目してください。このメソッドはまだ存在していないので、作成する必要があります。

この新しいメソッドをリスト 10 のソース・コードを使って作成します。変数 catalogServerConnection はソース・コードの少し上の方で MBeanServerConnection 型として定義されています。この変数を使って、Java 5 SDK に含まれている JMX API により、カタログ・サーバーへの JMX 接続を確立しています。printCatalogServers() メソッドはこの接続オブジェクトを使うことによって、その環境で定義されているカタログ・サーバーに関する情報を取得します。


リスト 10. printCatalogServers() メソッド
/*
* Prints all of the catalog servers known by the catalog server this tool is run against.
*/
private static void printCatalogServers(MBeanServerConnection catServerConn) {
	//make connection get ObjectGridServer info on catalog server
try {
	  Set<ObjectInstance> s = catServerConn.queryMBeans(new ObjectName
		("com.ibm.websphere.objectgrid:type=ObjectGridServer,*"), null);
	  Iterator<ObjectInstance> i = s.iterator();
	  System.out.println("Listing catalog servers known by this process:");
	  System.out.println("**********************************************");
	  while (i.hasNext()){
		DynamicServerMBean dsmb = (DynamicServerMBean)JMXProxy.getProxy
		   (catServerConn, i.next().getObjectName(), DynamicServerMBean.class);
		System.out.println("Catalog Server: " + dsmb.getServerName());
		System.out.println("Running on host: " + dsmb.getHostName() + "\n");
		}
		System.out.println("**********************************************");
	} catch (MalformedObjectNameException e) {
		e.printStackTrace();
	} catch (NullPointerException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

printCatalogServers() メソッドは JMX 接続を使ってシステムにクエリーを実行し、ObjectGridServer 型の MBeans を検索します。この型の MBeans は (これまでのバージョンの ObjectGrid とは異なり)、動的環境の中にあるカタログ・サーバーと静的環境の中にあるコンテナー・サーバーを表すために使われます。この MBeans を発見すると、このコードは xsadmin サンプル・アプリケーションの JMXProxy クラスを使ってプロキシー・オブジェクトに MBeans をキャストします。JMX クエリーによって返されるオブジェクトのリストに対して繰り返しこの操作を行うことにより、カタログ・サーバーのリストを名前順に出力します (このリストはきれいにフォーマット設定されており、またカタログ・サーバーが実行されているホスト名も記載されます)。ここで、DynamicServerMBean オブジェクト (ビルド・パスに組み込んだ objectgrid.jar ファイルに含まれているコードの一部) を介して公開される他のメソッドの出力を含めることによって、さらに情報を追加することもできます。

-catserv 引数に関してはこれで終わりです。再度 xsadmin アプリケーションを実行し、エラーがないことを確認します。出力はリスト 11 のようになるはずです。アプリケーションのランタイム定義に -catserv 引数を必ず追加してください (図 6)。


リスト 11. -catserv 引数の適切な使い方の例
Connecting to Catalog service at alaric:1099
Listing catalog servers known by this process:
**********************************************
Catalog Server: cat1
Running on host: alaric.mshome.net

**********************************************


図 6. Rational Application Developerに -catserv 引数を追加する

次に、この記事で追加する最後の新機能として、-cg 機能を取り上げます。




上に戻る


機能を追加する: -cg

ここまでで、xsadmin サンプル・アプリケーションの機能強化はほとんど終わっています。最後の機能強化として、もう 1 つの機能を上記と同じ方法で導入します。-cg 引数は、コア・グループ (リーダーとメンバー) の現在の状態に関する情報をユーザーに提供するために使用します。ちなみに、ゾーンが構成されている場合には、ゾーンの境界はコア・グループの境界でもあるため、ゾーンの中でコンテナーが分離されている様子を確認することができます。この機能を追加するためのステップの大部分は先ほどと同じなので、詳細は省略しましょう。

まず、Options クラスに新しい変数を追加します。この例ではこの変数を coreGroup と呼ぶことにし、Options クラスに下記のコード行を追加します。

boolean coreGroup;

これに合わせて CmdLineParser クラスの場合に下記の行を追加します。

final static String coreGroups = "-cg";

詳細な手順は「機能を追加する: -catserv」セクションを参照してください。

これらの新しい変数をクラスに追加したら、OGAdmin クラスの main() メソッドにハンドラー・コードを追加します。また、リスト 7 のコードも少し調整する必要があります。リスト 12 では新たに挿入したコードを太字で示しています。


リスト 12. スタンドアロン引数のリストに -cg を追加する
if (!(o.showContainers || o.showHosts || o.showPrimaries || o.showUnAssigned) 
	&& !o.listOG && !o.catServer && !o.coreGroup) {
    CmdLineParser.printHelp();
    // System.exit(-1);
    return;
}

これで、catServer 変数の場合と同様に、コマンドラインで他の引数なしで -cg 引数を指定することができます。

リスト 13 のコード・ブロックは、-cg 引数があることを検出し、この引数を処理するためのリクエストを適当なメソッド (この場合は printCoreGroupInformation()) に委譲します。


リスト 13. -cg 引数を検出する
//show core group info
if (o.coreGroup){
     	printCoreGroupInformation(jmxProxy);
}

printCoreGroupInformation() メソッドは、先ほど作成した printCatalogServers() メソッドとは少し異なります。printCatalogServers() メソッドの場合には、クエリーを実行してサーバー MBean を検索するために、JMX 接続オブジェクトをメソッドの引数として渡す必要がありました。printCoreGroupInformation() の場合は、jmxProxy 変数で表される PlacementServiceMBean オブジェクトがコア・グループの情報を提供します (アプリケーションが JMX オブジェクトを PlacementServiceMBean インスタンスにキャストします)。

最後のステップとして、新しい printCoreGroupInformation() メソッドのコードをアプリケーションの中に含めます。そのためにはリスト 14 のコードを使います。


リスト 14. printCoreGroupInformation() メソッド
private static void printCoreGroupInformation(PlacementServiceMBean psmb) {
System.out.println("Printing core group information:");
System.out.println("**********************************************");
try {
StringBuffer xml = new StringBuffer();
	xml.append("<objectgrid>\n"); //added root element to make SAX parser happy
	xml.append(	psmb.getCoreGroups());
	xml.append("</objectgrid>\n"); // added root element to make SAX parser happy
      //System.out.println(xml);
	InputSource is = new InputSource(new StringReader(xml.toString()));
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	factory.setNamespaceAware(true); // never forget this!
	DocumentBuilder builder = factory.newDocumentBuilder();
	Document doc = builder.parse(is);
	XPath xPath = XPathFactory.newInstance().newXPath();
	//get the core group blocks
	NodeList nodes = (NodeList) xPath.evaluate("coreGroup", doc.getFirstChild(), 
		javax.xml.xpath.XPathConstants.NODESET);
	Node node = null; //a single core group block
	Node leaderNode = null;
	Node memberNode = null;
	for (int i=0;i<nodes.getLength(); i++){
		node = nodes.item(i);
		System.out.println("\nCore Group Name  : " + node.getAttributes().
			getNamedItem("name").getTextContent());
		//get listing for coreGroupLeader elements
		NodeList leaderNodes = (NodeList)xPath.evaluate("coreGroupLeader", node, 
			javax.xml.xpath.XPathConstants.NODESET);
		for (int j=0;j<leaderNodes.getLength();j++){
			leaderNode = leaderNodes.item(j);
			System.out.println("\tLeader: " + leaderNode.getAttributes().
				getNamedItem("serverName").getTextContent() + "(" +
leaderNode.getAttributes().getNamedItem("hostName").
	getTextContent() + ")");
		}
		//get listing for coreGroupMember elements
		NodeList memberNodes = (NodeList)xPath.evaluate("coreGroupMember", node, 
			javax.xml.xpath.XPathConstants.NODESET);
		for (int k=0;k<memberNodes.getLength();k++){
			memberNode = memberNodes.item(k);
System.out.println("\tMember: " + memberNode.getAttributes().
			getNamedItem("serverName").getTextContent() + "(" +
		memberNode.getAttributes().getNamedItem("hostName").
			getTextContent() + ")");
		}
				
	}
} catch (ParserConfigurationException e) {
	e.printStackTrace();
} catch (SAXException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} catch (XPathExpressionException e) {
	e.printStackTrace();
}

int qStat = psmb.getQuorumActivationStatus();
System.out.println("----------------------------------------------");
switch (qStat){
   case 0:
	System.out.println("Quorum Activation Status:\n\tQuorum is disabled"); 
			break;
   case 1:
	System.out.println("Quorum Activation Status:\n\tQuorum is enabled:normal"); 
			break;
   case 2:
	System.out.println("Quorum Activation Status:\n\tQuorum is enabled:waiting 
			for quorum"); break;
   case 3:
	System.out.println("Quorum Activation Status:\n\tQuorum is overridden"); 
			break;
   case 4: 
	System.out.println("Quorum Activation Status:\n\tServer data may be 
			inconsistant"); break;
}
int hbfl = psmb.getHeartBeatFrequencyLevel();
switch (hbfl){
   case -1:
	System.out.println("Heartbeat Frequency Level:\n\tAgressive"); break;
   case 0:
	System.out.println("Heartbeat Frequency Level:\n\tTypical (default) "); 
			break;
   case 1:	
	System.out.println("Heartbeat Frequency Level:\n\tRelaxed "); break;
}
System.out.println("**********************************************");
}

printCoreGroupInformation() メソッドは、このアプリケーションに追加した中で最も複雑なメソッドです。この例の中で、最初の太字の行は PlacementServiceMBean インスタンスの getCoreGroups() メソッドを呼び出します。getCoreGroups() メソッドはコア・グループの情報を XML フォーマットの String オブジェクトとして返します。最初の太字の行に続くコードは Java の SAXParser オブジェクトを使ってこの XML ストリングを処理し、検索可能な Document オブジェクトに変換します。またコードの中では、この Document オブジェクトに対して XPath クエリーを実行するための XPath オブジェクトも作成しています。

2 番目の太字の行と 3 番目の太字の行は、クォーラム・サービスとハートビート頻度レベルに関する現在の状態の値を取得します。どちらのコード・ブロックも switch 文を使って int の値を評価します。こうすることで、人間が理解できるストリング値がコンソールに出力されます。

すべてのコードを保存し、アプリケーションを (今回は -cg 引数のみを使用して) 実行すると、リスト 15 のような出力が表示されるはずです。


リスト 15. -cg 引数を使用した場合の出力
Connecting to Catalog service at alaric:1099
Printing core group information:
**********************************************

Core Group Name  : Zone_AlphaCG0
	Leader: server1(alaric.mshome.net)

Core Group Name  : CoreGroup_0 CoreGroup_1
	Leader: cat1(alaric.mshome.net)

Core Group Name  : Zone_BravoCG0
	Leader: server2(alaric.mshome.net)
----------------------------------------------
Quorum Activation Status:
	Quorum is enabled:normal
Heartbeat Frequency Level:
	Typical (default) 
**********************************************




上に戻る


まとめ

この記事では、xsadmin サンプル・アプリケーションの機能強化をとおして IBM WebSphere eXtreme Scale の JMX インターフェースの扱い方を学んでいただきました。また、このアプリケーションでコマンドライン引数の処理と解析に使われている基本的なメカニズムについても理解できたことでしょう。これらの機能強化を完成させたことで、このサンプル・アプリケーションを抵抗なく扱えるようになったのではないでしょうか。このサンプル・アプリケーションは、さらにカスタマイズして皆さんの個別の仕様に合わせたり、Web 対応にして J2EE® Web アプリケーションとして利用できるようにしたりすることもできます。



参考文献



著者について

Author photo

John Pape は現在 WebSphere SWAT Team に所属し、WebSphere Application Server と WebSphere Portal Server、そして WebSphere Extended Deployment を利用するユーザーのための CRITSIT サポートを担当しています。この業務には細部に注目する能力と、たえず枠にとらわれない斬新な発想をすることが求められ、それによって可能な限り最高のサポートを IBM のユーザーに保証しています。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ