Message Routing サンプルの拡張

Message Routing サンプルの ESQL は、ほんの少し変更を加えるだけで、他のメッセージ・フローで使用できるような設計に なっています。

Routing_using_memory_cache メッセージ・フローの再使用

ESQL ファイル Routing_using_memory_cache には、キャッシュを使用する バージョンのサンプルで使用されるすべての ESQL が含まれています。 このファイルを開き、以下のセクション (ESQLSection 1 というマークが付けられている) を探してください。

Routing_using_memory_cache.esql

ESQL によって経路指定されることになるメッセージを基に、強調表示されている 3 つの部分 (Section 1、2、および 3) を変更する必要があります。

  1. 3 つの ESQL 変数 Variable1、Variable2、Variable3 は、データベース表から宛先キュー・マネージャーとキューを検索するために、Compute ノードで使用されます。これらの変数は、ハードコーディングされたものか、着信メッセージから取り出されたものです。このサンプルでは、最初の値がハードコーディングされており、他の 2 つが着信 XML メッセージから取り出されたものです。経路指定される可能性のあるメッセージのタイプごとに異なる値を使用できるよう、最初の値をハードコーディングするのは賢明です。そうすれば、1 つのデータベース表を多種多様なルーティング・データのセットに使用できます。ハードコーディングされた値を作成するには、DECLARE ステートメントでその値を設定してください。サンプルでは、Variable1 が SAMPLE_QUEUES の値に設定されています。
  2. ESQL のこのセクションは、メッセージの情報を使用して他の 2 つの変数を設定する方法を示しています。メッセージのタイプまたはフォーマットが異なる場合は、経路指定に必要な着信メッセージのフィールドを参照するよう、この部分を完全に書き直す必要があります。
  3. Variable の設定に問題がある場合は、デフォルト値が設定されます。サンプルでは、これらは値 default に設定されています。

別のメッセージ・フローで経路指定機能を提供するためにこの ESQL を再利用するときには、残りの部分を未変更のままにしておくことができます。データベース表は、新しいフローに必要な新規エントリーを追加して、更新する必要があります。メッセージ・フロー・プロジェクトのサンプルと共に提供されている、データ・スクリプト setupRoutingDatabase を参照してください。

ESQL を使用する際に行うべき 1 つの重要なことは、Compute ノード・プロパティーのモードが以下の値のいずれかに設定されて いるかどうかを確認することです。 設定されていない場合はルーティング情報が失われます。

データベース ODBC ソース名も Compute ノード・プロパティーに追加しなければなりません。

BEGIN ATOMIC ... END; ブロックの有効範囲の変更

BEGIN ATOMIC ... END; ステートメントは、一度に 1 つのスレッドのみがメモリー・キャッシュを使用するようにする ため、Routing_using_memory_cache メッセージ・フローで使用されます。 ESQL のこの部分の単一スレッドの制限が重要なのは、キャッシュを動的にリフレッシュする場合だけです。 メッセージ・フローの存続期間中にキャッシュのリフレッシュの必要がないと判断するのであれば、キャッシュの初期化だけを カバーするよう、atomic ブロックの有効範囲を小さくできます。 次の図は、現在の ESQL (ESQLSection 4 というマークが 付けられている) を示しています。

beging ブロックの移動
  1. BEGIN ATOMIC は、後続の ESQL が、対応する「END;」ステートメントに到達するまでは、 単一スレッドになるということを示します。
  2. 数字の 4 のマークが付けられた ESQL のコメントは、キャッシュを動的に リフレッシュしない場合に「END;」ステートメントを移動することのできる場所を示しています。
  3. 新しい「END;」ステートメントを上記のマーカー 4 に置く場合は、 現在の「END;」ステートメントを除去する必要があります。

この変更を加えた後、キャッシュ内のキュー名の検索は単一スレッドではなくなります。複数の異なるメッセージが同時にキャッシュから読み取りを行えるようになります。

メッセージ・フローを異なるシステムにデプロイしやすくするための外部変数の使用

外部変数を使うと、メッセージ・フロー内のハードコーディングされた値がメッセージ・フロー・レベルにプロモートされ、デプロイ時にそれらを変更できるようになります。デプロイ時に、デプロイ先の環境に合わせてメッセージ・フローをカスタマイズできます。これは、メッセージ・フローの ESQL に変更を加えることなく、行えます。

Routing_using_memory_cache メッセージ・フローには、Variable1 という変数があります。この変数はデータベース検索を行うために使用されます。これは、値 SAMPLE_QUEUES にハードコーディングされています。デプロイ時にこの変数を外部化し、デプロイ先のシステムに応じて値を変更できるようにするのは意味のあることです。これにより、システムごとに異なるキューとキュー・マネージャーのセットを使用しながら、それでもなお同一のデータベース表を使用することが可能になります。

Variable1 を外部変数にするには次のようにします。

  1. ESQL を変更して Variable1 を外部変数として宣言します。DECLARE Variable1 CHAR 'SAMPLE_QUEUES'DECLARE Variable1 EXTERNAL CHAR 'SAMPLE_QUEUES' に変更します。ESQL は次のようになるはずです。
    -- Section 1
    DECLARE Variable1 EXTERNAL CHAR 'SAMPLES_QUEUES';
    DECLARE Variable2 CHAR;
    DECLARE Variable3 CHAR;
  2. ここで外部変数をメッセージ・フロー・レベルで定義する必要があります。メッセージ・フロー Routing_using_memory_cache を開き、メッセージ・フロー・エディターの下部にある「ユーザー定義プロパティー」タブをクリックします。Variable1 という新しいプロパティーを作成し、そのデフォルト値を SAMPLE_QUEUES に設定します。

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

  3. これで変数 Variable1 は外部変数になります。メッセージ・フローを bar ファイルに追加してから「構成」タブをクリックします。フロー内の Compute ノードを選択すると、変数の値を変更できるはずです。

    Bar ファイル・エディター

この外部変数を使用するには、Variable1 のさまざまなパラメーターの入った、ROUTING データベースの ROUTING_TABLE 表に新規エントリーを作成する必要があります。Variable1 の値を変更せずにこのフローをデプロイすると、フローの機能は今までと同じです。(Variable1 はデフォルトで SAMPLE_QUEUES になります)

キャッシュのリフレッシュ基準の変更

データベース表の Message Routing サンプル・キャッシュについての現行リフレッシュ基準は次のとおりです。

キャッシュのリフレッシュのタイミングを決定する際、他の基準も使用できると便利です。 以下の基準が使用できます。

  1. 所定の時間が経過するとキャッシュがリフレッシュされる
  2. メッセージが所定の数に達するとキャッシュがリフレッシュされる

サンプルは、これらのいずれかの基準を使用するように、容易に変更することができます。 キャッシュのリフレッシュに関する ESQL での重要箇所は次のとおりです。

基準についての ESQL

60 秒の期間を使用するようにリフレッシュ基準を変更するには、以下を行います。

  1. ESQL で赤色でマークされている基準を次のように変更します。

    IF CacheQueueTable.LastUpDate is null or (CURRENT_TIMESTAMP - CacheQueueTable.LastUpDate) second > INTERVAL '60' SECOND THEN

  2. SET CacheQueueTable.valid = true; を次のように変更します。

    SET CacheQueueTable.LastUpDate = CURRENT_TIMESTAMP;

メッセージの数が 100 に達するとリフレッシュ基準が true になるように変更するには、次のようにします。

  1. ESQL で赤色でマークされている基準を次のように変更します。

    IF CacheQueueTable.MessageCount is null or CacheQueueTable.MessageCount > 100 SECOND THEN

  2. SET CacheQueueTable.valid = true; を次のように変更します。

    SET CacheQueueTable.MessageCount = 0;

  3. 次のように、ESQL モジュールの最後にステートメントを追加して、カウントを増分します。

    SET CacheQueueTable.MessageCount = CacheQueueTable.MessageCount +1;

メインページのアイコン   サンプルのホームに戻る