この記事では、WebSphere Message Broker V6 で強化された Java サポートを紹介します。ここでは、メッセージ・フロー・アプリケーションの開発時に Java を簡単に使えるようにする新しい JavaCompute ノードに焦点を当てます。

Peter Crocker (peter_crocker@uk.ibm.com), Senior IT Specialist, IBM

Photo of Peter CrockerPeter Crocker は、英国の IBM Hursley Software Lab 内のソフトウェア・サービス・チームで作業しています。WebSphere Message Broker を専門としており、アーキテクチャー、設計、および実装に関する優れた顧客のコンサルタントとして働いています。Peter は、この職務から Message Broker 開発チームに移動し、Message Broker の深い技術知識を社内に提供しています。V6 の発表前に、ベータ・プログラムの提供および開発を支援し、サービス・チームに対する新しい V6 の機能の教育を担当しました。



2006年 5月 31日

また、WebSphere Message Broker で Java について学習し、Java を使用する場合に役立つ参考文献を挙げます。

JavaCompute ノード

図 1. JavaCompute ノード
JavaCompute ノード

新しい JavaCompute ノードは、IBM® WebSphere® Message Broker V6 における Java™ の使いやすさを格段に向上させています。この JavaCompute ノードのおかげで、メッセージ・フロー・アプリケーションで使われる Java ソースを直接コーディングできるようになりました。もちろん ESQL でロジックをコーディングし、ESQL から Java プロシージャーを呼び出す方法や、カスタム処理ノードを作成する方法も有効な選択肢としてありますが、WebSphere Message Broker V6 で Java を使う場合は、JavaCompute ノードを使用することをお勧めします。JavaCompute ノード用に開発されたコードは、メッセージ・フロー、メッセージ・セット、および ESQL ロジックをデプロイする場合と同じメカニズムを使ってブローカー・ランタイムにデプロイできるという大きな利点があります。この特徴のおかげで、ESQL を使ってメッセージ・フローを開発するときと、同じように作業を行うことができます。

また、JavaCompute ノードは、XPath 1.0 構文に基づくメッセージ処理で、既存の Java API を拡張します。ツールキット内でこれらのノードの Java コードを作成すると、Java 開発環境を最大限に活用することができます。この Java 開発環境は、Rational Application Developer 上に構築され、コンテンツ・アシストやリファクタリング・ツールなどの役に立つ機能を提供しています。さらに、JavaCompute ノード・ウィザードも組み込まれています。JavaCompute ノード・ウィザードは、Java プロジェクトをテンプレート・クラスとプロジェクトに必要な依存関係への参照で初期化します。JavaCompute ノードでは外部クラスを使用できるため、メッセージ・フロー内の Java で作成された既存のビジネス・ロジックを再利用することが可能になります。

Java のスキルを持つ人々は、JavaCompute ノードを使って、フローのロジックをすべて Java でコーディングすることができます。この際、開発プロセスを完全にサポートする環境とデプロイメント・モデルでツールキットを用いることができます。


JavaCompute ノードの機能

JavaCompute ノードを使用すると、以下の作業を行うことができます。

  • メッセージ・コンテンツに基づくメッセージのルーティング
  • ノードを通過する際にメッセージに情報を追加
  • 新しい出力メッセージの作成
  • Java 言語によって提供される他の機能の使用

以降のセクションでは、JavaCompute ノードの作成、開発、およびデプロイメントといった機能の技術的な面に焦点を当てます。

JavaCompute ノードのコードの作成

JavaCompute ノードでは、com.ibm.broker.javacompute.MbJavaComputeNode クラスを拡張する Java プロジェクト内に Java クラスを実装する必要があります。MbJavaComputeNode クラスに対する機能拡張では、evaluate メソッドを実装する必要があります。この evaluate メソッドは、JavaCompute ノードが受け取るメッセージの処理に使われるロジックを提供します。また Java プロジェクトには、Message Broker の Java Compute ノードの API (javacompute.jar および jplugin2.jar) を実装する jar ファイルへの参照を含める必要があります。JavaCompute ノード・ウィザードは、テンプレート・クラスおよびプロジェクトに必要な依存関係への参照で Java プロジェクトを初期化するだけでなく、大部分のセットアップを実行して、名前を指定してテンプレートを選択するようプロンプトを出します。JavaCompute ノードをメッセージ・フローに追加した後は、以下のステップで、構成ウィザードを起動して実行する必要があります。

  1. ノードを右クリックして、「Java を開く (Open Java)」を選択します。JavaCompute ノード・ウィザードが開きます。
  2. Java プロジェクト名を指定します。プロジェクトが作成され、JavaCompute ノード開発のために初期化されます。
  3. 新しい Java クラスの名前を指定します。
  4. ノード・クラスのテンプレートを選択します。
    • メッセージ・クラスのフィルター操作 (Filtering message class) -- メッセージの内容を基にしてメッセージ・フロー内でルーティングを行います。
    • メッセージ・クラスの変更 (Modifying message class) -- ノードのパススルー時にメッセージを変更します。
    • メッセージ・クラスの作成 (Creating message class) -- フローによって伝搬される新しいメッセージを作成します。
  5. テンプレートを選択したら、ツールキット内のパースペクティブが Java パースペクティブに切り替えられ、選択したテンプレートを基にしたコードに焦点が合わせられます。これで、この新しいノードが必要とするロジックをコーディングすることができます。
図 2. JavaCompute ノード構成ウィザード
JavaCompute ノード構成ウィザード

以下に、最初のフィルター・テンプレートが選択された場合に表示されるコードを示します。

図 3. JavaCompute ノード・テンプレート
JavaCompute ノード・テンプレート

次に、Eclipse でコンテンツ・アシストを使ってクラスを作成することができます。

既存のコードとの関連付け

JavaCompute ノード・クラスを作成したら、その後のノードで再利用することができます。これを行うには、単に新しい JavaCompute ノードをメッセージ・フローにドロップしてから、ノードのプロパティーで既存のクラス・タイプの中から選択します。

メッセージ処理

JavaCompute ノードは、ルーティング・ロジックと変換ロジックの両方でメッセージ・フローを提供することができます。ルーティングと変換に使用できる機能と技法の要約を以下に示します。

フロー内のルーティング

メッセージ・フロー内でメッセージを送信するための機能により、フロー決定ポイントが指定されるため、特定のメッセージに代替の処理と宛先を選択することができます。フロー内でメッセージを送信するためには、ノード端末を介するか、route-to-label の手法を使用できます。

ルーティングに Out 端末と Alternate 端末を使用する

図 4. ルーティングに Out 端末と Alternate 端末を使用
ルーティングに Out 端末と Alternate 端末を使用

JavaCompute ノードには、2 つの出力端末を介した双方向のルーティング機能が組み込まれています。この 2 つの端末には、ツールキットでは「Out」端末と「Alternate」端末というラベルが付いています。

public void evaluate(MbMessageAssembly assembly) throws MbException
{
    MbOutputTerminal out = getOutputTerminal("out");
    MbOutputTerminal alt = getOutputTerminal("alternate");

次のコード抽出は、これらの端末を取得してこのメソッド内で伝搬できるようにします。Java コード内で端末を参照する場合は、先頭文字に小文字を使用してください。次にコード out.propagate(assembly) で、受信したメッセージを Out 端末に伝搬します。

同様に、Alternate 端末に送信される一部のメッセージをフィルターに掛けるために、alt オブジェクトで propagate メソッドが呼び出されます。ノードで作成された MbMessage オブジェクトが使っていたメモリーを即時に解放するには、evaluate から戻される前に、必ず MbMessage オブジェクトで clearMessage メソッドを呼び出します。

フィルター・タイプ・ノードを作成するには、JavaCompute ノード作成ウィザードで「メッセージ・クラスのフィルター操作 (Filtering Message Class)」テンプレートを選択します。

RegexFilterNode サンプルと RoutingFileNode サンプルにはこの機能の例が示してあります。この記事で参照されているサンプルはすべて WebSphere Message Broker V6 に含まれています。

RouteToLabel

2 つの端末を下流にルーティングするだけでは不十分な場合は、他の製品と同様に RouteToLabel の手法を使うことができます。以下のフローは、RouteToLabel ノードがメッセージを伝搬するラベル・ノードをJavaCompute ノードが判別する例を示しています。

図 5. ルーティングに Route To Label を使用する
ルーティングに Route To Label を使用する

メッセージの変換

メッセージを変換するには、入力メッセージをナビゲートして、変更済みまたは新しい出力メッセージを作成します。

入力メッセージのナビゲート

メッセージ・ベースのルーティングと変換の両方で、ノードが受け取るメッセージをナビゲートする必要があります。次のメッセージは後続のコード抽出で使われ、メッセージのナビゲートに使用できる技法を示しています。XML 文書は、以下の構文解析されたメッセージ・ツリー形式に示されています。

 <document>
  <chapter title='Introduction'>
    Some text.
  </chapter>
 </document>
図 6. サンプル文書を解析した結果生じたメッセージ・ツリー
サンプル文書を解析した結果生じたメッセージ・ツリー

Key には、メッセージ・ツリーをナビゲートするために MbElement クラスに対して使用可能な一部の Java メソッドの詳細が示されています。

XPath 1.0 構文を使ったメソッドも使用可能ですが、この図には示されていません。

MbElement ナビゲーション

この Java コードは document にアクセスして、次に論理ツリーの最初の chapter 要素にアクセスします。

MbElement root = assembly.getMessage().getRootElement();
MbElement document = root.getLastChild().getFirstChild();
MbElement chapter = document.getFirstChild();  // returns the first chapter

JavaComputeTransformNoXPath サンプルではこの機能の例が示されています。

XPath 1.0 ナビゲーション

XPath 構文を使って、メッセージの内容を検索することもできます。次の Java コードは、XPath 構文を使って論理ツリーの最初の chapter 要素にアクセスします。

MbMessage msg = assembly.getMessage();
// the following returns a list of all chapters in the document using an XPath 
// expression.
List chapters= (List)msg.evaluateXPath("/document/chapter");
MbElement chapter = (MbElement)chapters.get(0);  // returns the first chapter

WebSphere Message Broker V6 に付属の JavaComputeTransformXPath サンプルはこの機能を説明します。

出力メッセージの作成

今度も、XPath でモデリングされた API と構文を使って、出力メッセージを作成することができます。

MbElement の作成

特定の MbElement を指定すると、メッセージ・ツリー要素にアクセスする場合と同じような方法で、create メソッドにアクセスして、このメソッドを使って子要素と兄弟要素を作成することができます。次のコードにより、chapter の最初の子として title 要素が作成されます。

	MbElement title = chapter.createElementAsFirstChild(MbXML.ATTRIBUTE, 
						 "title", 
						 "Introduction");

WebSphere Message Broker V6 に付属の JavaComputeTransformNoXPath サンプルはこの機能を最もよい実例です。

XPath の作成

XPath サポートには、XPath のような構文を持つ要素を作成できる XPath 拡張が含まれています。そのため、例えば、「/?title[set-value(‘Introduction’)]」により、 title 要素が作成され、その値が設定されます。

次のコードは、document 要素と chapter 要素が含まれるメッセージを指定すると、title 要素を追加して、その値を設定します。

message.evaluateXPath("/document/chapter/?@title[set-value('Introduction')]");

WebSphere Message Broker V6 に付属の JavaComputeTransformXPath サンプルはこの機能の実例です。

ノードの構成

JavaCompute ノードを構成するためのメカニズムは数多くあります。

  • ユーザー定義プロパティー (V6 の新機能)
  • ノードが受け取るメッセージ
  • ブローカー属性
  • ファイル

次のセクションでは、これらの技法について詳しく説明します。

ユーザー定義プロパティー

ユーザー定義プロパティーは V6 の新しいメカニズムであり、メッセージ・フロー内のノードにフロー・レベルの構成を提供します。これは JavaCompute ノード内ではユーザー定義属性と呼ばれ、getUserDefinedAttributes メソッドに属性名が指定されている場合は、フローで設定された値を返します。これらの設定は、個々のノード上ではなくフロー・レベルで行われるため、フロー内のすべての JavaCompute ノードと Compute ノードが同じプロパティーにアクセスすることができます。

図 7. ユーザー定義属性
ユーザー定義属性

前のフローでは、次の Java 呼び出しを介してプロパティーにアクセスすることができます。

String regexValue = (String)getUserDefinedAttribute("filterRegex");
String fieldValue = (String)getUserDefinedAttribute("filterField");

WebSphere Message Broker V6 に付属の RegexFilterNode サンプルはこの機能の実例で、このセクションの図でも使われています。

メッセージ

ノードを通過する際のメッセージは、動的構成に使うことができます。Environment と LocalEnvironment、およびメッセージ本文を利用すると、数多くの方法でこの構成を設定することができます。次に、クラスの静的メンバーにこれらの設定を保管することができます。これによって、後続のメッセージでこの値を使えるようになります。静的変数は、実行グループが開始されるか、メッセージ・フローがデプロイされるたびにデフォルトに戻ります。

ブローカー属性

Java API は、ノードが実行されているブローカー、実行グループ、およびメッセージ・フローの詳細を検索するためのブローカー属性を数多く提供します。次のコードは、これらの各リソースの名前を検索します。ここにリストされていない他の値も使用可能です。

	String messageBrokerName 		= getBroker().getName();
	String messageExecutionGroupName 	= getExecutionGroup().getName();
	String messageFlowName 		= getMessageFlow().getName();

この場合もまた、これらのブローカー属性を使って、環境に依存にした構成を指定することができます。

ファイル

ランタイム・システム上のファイルには、ノードを構成するためにも使用できる標準の java.io クラスを使って Java Compute ノードでアクセスすることができます。さらに、Java クラス・ファイルとともに jar にデプロイされているファイルは Java コードでもアクセス可能です。ルーティング・ファイル・ノード (Routing File Node) サンプルはこの機能を説明します。

Java 依存関係の呼び出し

JavaCompute ノードのために作成された Java クラスは、既存の Java クラスに対する呼び出しを行うことができます。jar ファイルを参照する Message Broker ランタイムでは、この jar ファイルをブローカー・アーカイブ・ファイル内にデプロイするか、<Work Path>/shared-classes にコピーするか、または Message Broker クラスパスに置く必要があります。GoogleAPINode サンプルと NewsGroupGetNode サンプルはこの機能の実例です。

データベース・サポート

次の 2 つの方法でデータベースにアクセスできます。

  • MbSQLStatement - Message Broker によって管理される ODBC データ・ソースへのアクセスを提供する Java API 内のクラス。これは、従来のトランザクションの完全性を提供するデータ・アクセス方法です。更新、削除、および挿入は、残りのメッセージ・フローと調整されます。
  • タイプ 4 JDBC ドライバー - このインターフェースを使って実行される更新は、トランザクション面で他のリソースと調整されません。メッセージ・フローでも更新を行うことができます。

JavaCompute ノードを含むフローのデプロイ

デプロイメントは、ブローカー上の実行グループにデータを転送して、ブローカー・ドメインで有効になるようにするプロセスです。メッセージ・フローおよび関連する JavaCompute クラスをデプロイするために、これらのリソースは、通常のデプロイメント・プロセスの一部としてブローカー・アーカイブ (bar) ファイルにパッケージされます。JavaCompute ノードに固有のステップは他に必要ありません。JavaCompute ノードを含むフローを bar ファイルに追加すると、Java クラスも Java Archive (jar) ファイルにパッケージされます。その後、bar ファイルに組み込まれて、後でブローカーにデプロイすることができます。

jar ファイルをブローカーにデプロイすると、右手に示すように、メッセージ・フローとともにツールキット内のドメイン (Domains) ビューに表示されます。V6 では、jar ファイルではのバージョン管理とキーワードのサポートも提供され、jar ファイルに組み込まれたファイル (META-INF/keywords.txt) で行われた設定が使用されます。

図 8. デプロイされた JavaCompute ノード
デプロイされた JavaCompute ノード

デバッグ

Message Broker ツールキットでノードをデバッグするには、まず Message Broker が実行している JVM のデバッグ・ポートを設定します。次のコマンド構文を使用します。ブローカー名、実行グループ、およびポート番号が必要です。

mqsichangeproperties <Broker Name> -e <Execution Group Name> 
	-o ComIbmJVMManager -n jvmDebugPort -v <Port Number>

この設定を有効にするには、実行グループを再起動します。ツールキット内で Message Broker デバッグ・セッションをセットアップするときに、Java デバッグ・ポートを入力します。実行グループのみを再開するには、次のコマンドを使用します。

mqsireload <Broker Name> -e <Execution Group Name>

JavaCompute ノード・サンプル

WebSphere Message Broker V6 には、5 つのメッセージ・フローとそれに対応する JavaCompute ノード・クラスで構成されるサンプルが付属しています。これらのノード・クラスはこうしたノードの機能を実例で示します。

  • RegexFilterNode サンプル -- JavaCompute ノードをフィルター・ノードとして使用する方法、およびユーザー定義属性の使用法を実例で示します。
  • RoutingFileNode サンプル -- 外部ソース (この場合はプロパティー・ファイル) からロードされるフィルター規則を使って、JavaCompute ノードを filter ノードとして使用する方法を実例で示します。
  • JavaComputeTransform サンプル -- 入力メッセージを読み取って、新しい出力メッセージを生成することによって、JavaCompute ノードを使って簡単なインボイスを処理する方法を実例で示します。
  • GoogleAPINode サンプル -- JavaCompute ノードが外部サービスを呼び出して、この呼び出しの結果を基にして新しいメッセージを伝搬する方法を実例で示します。
  • NewsGroupGetNode サンプル -- JavaCompute ノードは外部 API を呼び出して、この呼び出しの結果を着信メッセージに追加する方法を実例で示します。

サンプル・ユーティリティー・メソッドは、最小の MQMD または RFH2 ヘッダーを追加するために SampleUtils.java にも組み込まれています。


JavaCompute ノードのパフォーマンス

Java サポートは、ESQL と比べて勝るとも劣らない効率的な実装を基にしています。次の表は、XPath 構文メソッドを使用する JavaCompute ノードおよび Compute ノード内の ESQL で実装される同等の機能について、メッセージのスループットの詳細を示しています。このサンプルは単純で、メッセージにはビジネス・ロジックがほとんどコーディングされていないため、Java の観点から比較した場合に最も良くない比較結果であると示されています。実際には、もっと高い比率でビジネス・ロジックが存在することが多いため、Java を実行した場合の利点によって、遜色のない結果になります。

表 1. 同一のメッセージ処理を実行した場合の ESQL 実装と Java 実装でのメッセージ・スループット比較
タスクESQL メッセージ/秒JavaCompute メッセージ/秒ESQL との比率で表した JavaCompute
入力メッセージの計算88679390%
入力メッセージの操作86672080%
最初の要素でのフィルター2443222190%

これらの数字は、4 x 2GHz Intel Xeon プロセッサーと 3.5 GB の RAM を搭載し、Microsoft Windows 2000 (SP4) が実行されている IBM xSeries 360 サーバーで、1K バイトの非永続 XML メッセージを使って記録されました。

ご覧のとおり、Java 実装は ESQL 実装と比べても遜色がありません。多数のMessage Broker シナリオと同様に、大部分の処理はメッセージ内の要素の構文解析とアクセスで行われます。この処理は、ロジックをコーディングした言語に関係なく、同一の基礎となる XML パーサーによって実行されます。パフォーマンスの向上とこれらの数字の元となったテスト・ケースの詳細については、WebSphere Message Broker V6 のパフォーマンス・レポートを参照してください。

z/OS ユーザーは、IBM System z Application Assist Processor (zAAP) で JavaCompute ノードを使用することで、コストを削減することができます。JavaCompute ノード・クラス内で行われる作業はすべて zAAP プロセッサーにオフロードすることができます。ただし、WebSphere Message Broker のメッセージ・パーサーおよびシリアライゼーションに関連する処理は、zAAP 上で実行するには不適切です。


WebSphere Message Broker での Java の追加サポート

ユーザー定義の拡張機能

Message Broker 内のノードとして実行するコードを作成するには、ユーザー定義の拡張機能を使用することもできます。この方法を使って作成されたノードは、端末の数と名前、ノードのプロパティー、およびノードがフローの input ノードとして機能するかどうかを指定することができます。ただし、ユーザー定義の拡張機能のクラスはランタイムにインストールされる必要があります。これらのクラスは、JavaCompute ノードによって使用されるクラスのデプロイメント・メカニズムの利点を利用しません。

V6 に新たに追加された Par ファイルにより、ユーザー定義の拡張機能のクラスと依存関係を一緒にパッケージして、1 つのユニットとして Message Broker にインストールすることができます。

構成マネージャー API

構成マネージャー API は構成マネージャーとの Java インターフェースであり、これを使用することで、ブローカー・ドメインをプログラマチックに制御できます。これは Message Broker ツールキットで使用されるインターフェースです。そのため、メッセージ・フローを作成して実行グループにデプロイするか、メッセージ・フローを停止して開始すると、すべて Java アプリケーション内から実行可能になります。このサポートを提供するには、API により、構成マネージャーが実行されているキュー・マネージャーへの WebSphere MQ クライアント接続を作成します。インストールに組み込まれている「構成マネージャーのプロキシー API エクササイザー (Configuration Manager Proxy API Exerciser)」サンプルが、この API の完全な機能の実例を示します。以下にあるこのアプリケーションのスクリーン・ショットには、左側にこのドメイン (構成マネージャーから最後のメッセージ・フローまで) のリソースが表示されています。右側のウィンドウには、選択したメッセージ・フローについて報告された詳細情報が示されます。

図 9. 構成マネージャー・プロキシー API エクササイザー (Configuration manager proxy API exerciser)
構成マネージャー・プロキシー API エクササイザー (Configuration manager proxy API exerciser)

まとめ

この記事では、WebSphere Message Broker V6 での強化された Java サポートについて説明して、新しい JavaCompute ノードの機能に焦点を当てました。また、これらのいずれかのノード用に Java コードを作成する方法、このコードをどれほど簡単に Message Broker にデプロイできるかを示しました。ルーティング機能と変換機能を優れたパフォーマンスと組み合わせることで、完全に Java でコーディングされたロジックを持つメッセージ・フローは、Java スキルを備えた人々が実行できる代替案になります。Java ビジネス・ロジックが既に存在する場合は、これらのいずれかのノード内で再利用することができます。また、この新規リリースの WebSphere Message Broker で強化された Java サポートについても説明しました。WebSphere Message Broker V6 での Java サポートおよび関連するテクノロジーについて詳しくは、以下の「参考文献」セクションを参照してください。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=277915
ArticleTitle=WebSphere Message Broker V6 で Java を使用する
publish-date=05312006