WebSphere Message Broker バージョン 8.0.0.5 オペレーティング・システム: AIX、HP-Itanium、Linux、Solaris、Windows、z/OS

製品の最新バージョンについては、IBM Integration Bus バージョン 9.0 をご覧ください。

Java での入力ノードの作成

入力ノードは、通常は組み込み入力ノードによってサポートされていない送信元からのメッセージを、メッセージ・フローに受信するために使用されます。

始める前に

Java ユーザー定義ノードは、.jar ファイルとして配布されます。

Java プロジェクトの作成

WebSphere® Message Broker Toolkit に Java ノードを作成する前に、 Java プロジェクトを作成する必要があります。

  1. 「ファイル」 > 「新規」 > 「プロジェクト」をクリックし、「Java プロジェクト」を選択してから、「次へ」をクリックします。
  2. プロジェクトに名前を指定し、「次へ」をクリックします。
  3. 「Java 設定」ペインで、「ライブラリー」タブを選択して、「外部 JAR の追加」をクリックします。
  4. install_dir¥classes¥jplugin2.jar を選択します。ここで、install_dirWebSphere Message Broker インストール済み環境のホーム・ディレクトリーです。
  5. 「その他」タブのプロンプトに従って、他のビルド設定を定義します。
  6. 「終了」をクリックします。
このようにしたら、次はこのプロジェクトの中で Java ノードのソースを開発することができます。

入力ノード・クラスの宣言

MbInputNodeInterface をインプリメントし、ブローカーの LIL パスに含められるすべてのクラスは、 入力ノードとしてブローカーに登録されます。 MbInputNodeInterface をインプリメントする場合は、このクラスの run メソッドもインプリメントしなければなりません。 run メソッドは、 メッセージ・フローの開始を表し、 メッセージを公式化するデータを含んでいて、これをフローに伝搬します。 ブローカーは、スレッドが使用可能になると、 指定されたスレッド化モデルに従って run メソッドを呼び出します。

クラス名は、末尾が "Node" という語でなければなりません。 例えば、WebSphere Message Broker Toolkit で名前が BasicInput である場合、クラス名は BasicInputNode でなければなりません。

入力ノード・クラスを宣言するには、例えば次のようにします。

package com.ibm.jplugins;

import com.ibm.broker.plugin.*;

public class BasicInputNode extends MbInputNode implements MbInputNodeInterface
{
...

以下のステップに従って、WebSphere Message Broker Toolkit でのこのアクションを完了します。

  1. 「ファイル」 > 「新規」 > 「その他」をクリックし、 「クラス」を選択してから、「次へ」をクリックします。
  2. パッケージおよびクラス名フィールドに適切な値を設定します。
  3. 「スーパークラス」テキスト・フィールドのテキストを削除し、「ブラウズ」ボタンをクリックします。
  4. MbInputNode を選択します。
  5. 「インターフェース」テキスト・フィールドの横にある「追加」ボタンをクリックして、 MbInputNodeInterface を選択します。
  6. 「終了」をクリックします。

ノードのコンストラクターの定義

ノードがインスタンス化されるときは、 ノード・クラスのコンストラクターが呼び出されます。 このクラスは、ノードのターミナルを作成し、属性のデフォルト値を初期設定する場所です。

入力ノードには、いくつかの出力ターミナルが関連付けられますが、 通常は入力ターミナルはありません。 ノードに出力ターミナルを追加するには、 ノードをインスタンス化するときに createOutputTerminal メソッドを使用します。 例えば、3 つの出力ターミナルを持つノードを作成するには、 次のようにします。

public BasicInputNode() throws MbException
{
	createOutputTerminal ("out");
	createOutputTerminal ("failure");
	createOutputTerminal ("catch");
	setAttribute ("firstParserClassName","myParser");
	attributeVariable  = "none"; 
}

外部データのバッファーへの受信

入力ノードは、ノードからの出力が正しい形式になっていれば、どんなタイプの外部ソース (ファイル・システム、キュー、またはデータベースなど) からでも、他のすべての Java プログラムと同じようにデータを受信することができます。

入力データを格納する入力バッファー (またはビット・ストリーム) を準備し、これをメッセージ・オブジェクトと関連付けます。 MbInputNode クラスの createMessage メソッドを使用してバイト・アレイからメッセージを作成し、このメッセージから有効なメッセージ・アセンブリーを生成します。 例えば、ファイルから入力データを読み取るには、次のようにします。

  1. ファイルから読み取る入力ストリームを作成します。
    FileInputStream inputStream = new FileInputStream("myfile.msg");
  2. 入力ファイルのサイズのバイト・アレイを作成します。
    byte[] buffer = new byte[inputStream.available()];
  3. ファイルからバイト・アレイに読み取ります。
    inputStream.read(buffer);
  4. 入力ストリームを閉じます。
    inputStream.close();
  5. キューに書き込むメッセージを作成します。
    MbMessage msg = createMessage(buffer);
  6. このメッセージを保管するためのメッセージ・アセンブリーを作成します。
    msg.finalizeMessage(MbMessage.FINALIZE_VALIDATE);
    MbMessageAssembly newAssembly =
         new MbMessageAssembly(assembly, msg);

メッセージの伝搬

メッセージ・アセンブリーの作成後、それをノードで定義された出力ターミナルの 1 つに伝搬できます。

例えば、メッセージ・アセンブリーを out という名前のターミナルに伝搬するには、次のようにします。
MbOutputTerminal out = getOutputTerminal("out");
out.propagate(newAssembly);
メッセージを削除するには、次のようにします。
msg.clearMessage();

メッセージ・ツリー用に割り振られているメモリーをクリアするには、 try/catch の finally ブロック内で clearMessage() 関数を呼び出します。

スレッド化とトランザクション性の制御

ブローカー・インフラストラクチャーは、 メッセージ処理の完了時の WebSphere MQ やデータベースの作業単位のコミットの制御などのトランザクション問題を処理します。 ただし、ユーザー定義ノード内から変更されたリソースは、ブローカーのトランザクション制御に置かれるとは限りません。

各メッセージ・フロー・スレッドは、各メッセージ・フローごとに維持されているスレッドのプールから割り振られ、run メソッドで始動します。

ユーザー定義ノードは戻り値を使用して、トランザクションが正常かどうかを示し、トランザクションをコミットするかロールバックするか、また、いつスレッドをプールに戻すかを制御します。 ブローカー・インフラストラクチャーは、未処理の例外があればすべてそれをキャッチし、そのトランザクションをロールバックします。

トランザクションとスレッド化の動作は、以下の適切な戻り値を使用して判断します。

MbInputNode.SUCCESS_CONTINUE
トランザクションはコミットされ、 ブローカーが同じスレッドを使用して再び run メソッドを呼び出します。
MbInputNode.SUCCESS_RETURN
トランザクションがコミットされ、 このメッセージ・フローに対する唯一のスレッドでなければ、スレッドがスレッド・プールに戻されます。
MbInputNode.FAILURE_CONTINUE
トランザクションはロールバックされ、 ブローカーが同じスレッドを使用して再び run メソッドを呼び出します。
MbInputNode.FAILURE_RETURN
トランザクションがロールバックされ、 このメッセージ・フローに対する唯一のスレッドでなければ、スレッドがスレッド・プールに戻されます。
MbInputNode.TIMEOUT
run メソッドが、 入力データの到着を待ちながらいつまでもフローを阻止することがあってはなりません。 フローがユーザー・コードによってブロックされている間は、 そのブローカーをシャットダウンしたり再構成したりすることができません。 run メソッドは、 定期的に run メソッドから制御を戻してブローカーに譲る必要があります。 特定の期間 (例えば、5 秒間) が過ぎても入力データが受信されない場合、このメソッドは TIMEOUT 戻りコードと共に制御を戻さなければなりません。 ブローカーをシャットダウンしたり再構成したりする必要がなければ、入力ノードの run メソッドがすぐにまた呼び出されます。
マルチスレッド・メッセージ・フローを作成する場合は、メッセージの作成後、そのメッセージを出力ターミナルに伝搬する前に、dispatchThread メソッドを呼び出します。 このアクションにより、他のスレッドがメッセージを処理している間に、1 つのスレッドだけがデータを待つようになります。 スレッド・プールからは、メッセージ・フローの 「追加インスタンス」プロパティーで指定された最大限度までの新規スレッドが取得されます。 以下に例を示します。
public int run( MbMessageAssembly assembly ) throws MbException
{
  byte[] data = getDataWithTimeout();  // user supplied method
                                       // returns null if timeout
  if( data == null )
    return TIMEOUT;

  MbMessage msg = createMessage( data );
  msg.finalizeMessage( MbMessage.FINALIZE_VALIDATE );
  MbMessageAssembly newAssembly =
       new MbMessageAssembly( assembly, msg );

  dispatchThread();

  getOutputTerminal( "out" ).propagate( newAssembly );

  return SUCCESS_RETURN;
}

ノード名の宣言

WebSphere Message Broker Toolkit によって使用および識別されるノード名を宣言する必要があります。 すべてのノード名は、末尾が "Node" でなければなりません。 名前は以下のメソッドを使用して宣言します。

public static String getNodeName()
{
   return "BasicInputNode";
}
このメソッドが宣言されていない場合は、Java API フレームワークが以下の規則に従ってデフォルトのノード名を作成します。
  • パッケージ名にはクラス名が付加されます。
  • ピリオドは除去され、パッケージ名とクラス名の各部の最初の文字が大文字になります。
例えば、 デフォルトでは以下のクラスにノード名 "ComIbmPluginsamplesBasicInputNode" が割り当てられます。
package com.ibm.pluginsamples;
public class BasicInputNode extends MbInputNode implements MbInputNodeInterface
{
   ...

属性の宣言

Java bean プロパティーに使用したのと同じメソッドを使用してノード属性を宣言します。 属性の get メソッドおよび set メソッドはユーザーが作成しなければなりません。API フレームワークは、Java bean イントロスペクション規則を使用して属性名を推測します。 例えば、以下の 2 つのメソッドを宣言するには、次のようにします。

private String attributeVariable;

public String getFirstAttribute()
{
  return attributeVariable;
}

public void setFirstAttribute(String value)
{
  attributeVariable = value;
}

ブローカーは、このノードが firstAttribute という属性を持つことを推測します。 この名前は、いずれかの内部クラス・メンバーの変数名ではなく、get または set メソッドの名前に由来します。 属性はストリングとしてしか公開できないので、get または set メソッドで数値タイプとストリングの変換を行ってください。 例えば、次のメソッドは timeInSeconds という属性を定義します。

int seconds;

public String getTimeInSeconds()
{
  return Integer.toString(seconds);
}

public void setTimeInSeconds(String value)
{
  seconds = Integer.parseInt(value);
}

ノード機能のインプリメント

先に述べたとおり、ブローカーは run メソッドを呼び出して入力メッセージを作成します。 このメソッドは、入力ノードのためのすべてのアプリケーション処理機能を備えている必要があります。

デフォルトのメッセージ・パーサー属性のオーバーライド (オプション)

入力ノード・インプリメンテーションは通常、入力メッセージをどのメッセージ・パーサーが最初に構文解析するかを判別します。 例えば、組み込まれている MQInput ノードは、MQMD ヘッダーを構文解析するために MQMD パーサーが必要であることを指示します。 ユーザー定義入力ノードは、組み込まれている以下のデフォルト属性 (オーバーライド可能) を使用することによって、適切なヘッダーかメッセージ・パーサー、および構文解析の制御のモードを選択することができます。

rootParserClassName
ユーザー定義入力ノードによってサポートされているメッセージ形式を構文解析するルート・パーサーの名前を定義します。 デフォルトでは GenericRoot に設定されます。 これは、ブローカーにパーサーを割り振らせたりチェーニングするために提供されているルート・パーサーです。 おそらく、ノードでこの属性値を変更する必要はありません。
firstParserClassName
ビット・ストリームを構文解析する役割を持つパーサーのチェーンの中で、 最初のパーサーの名前を定義します。 デフォルトでは XML に設定されます。
messageDomainProperty
入力メッセージを構文解析するのに必要なメッセージ・パーサーの名前を定義するオプションの属性。 サポートされる値は、MQInput ノードによってサポートされるものと同じです。
messageSetProperty
MRM パーサーが messageDomainProperty 属性によって指定された場合にのみ、 Message Set フィールドのメッセージ・セットの ID (またはメッセージ・セット名) を定義するオプションの属性。
messageTypeProperty
MRM パーサーが messageDomainProperty 属性によって指定された場合にのみ、 MessageType フィールドのメッセージの ID を定義するオプションの属性。
messageFormatProperty
MRM パーサーが messageDomainProperty 属性によって指定された場合にのみ、 Message Format フィールドのメッセージの形式を定義するオプションの属性。

ノードのインスタンスの削除

ノードのインスタンスは、次のいずれかの場合に削除します。
  • ブローカーがシャットダウンされた。
  • ノードまたはノードを含むメッセージ・フローを除去し、 構成を再デプロイした。
オプションの onDelete メソッドがインプリメントされている場合、そのノードが削除される際に、ソケットを閉じるなどのクリーンアップ操作を実施することができます。 ノードが削除される直前に、このメソッドが (もし存在すれば) ブローカーによって呼び出されます。

onDelete メソッドを、次のようにしてインプリメントします。

public void onDelete()
{
  // perform node cleanup if necessary
}
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        最終更新:
        
        最終更新: 2015-02-28 17:48:09


タスク・トピックタスク・トピック | バージョン 8.0.0.5 | as09950_