データベースを使用する Message Routing サンプルの拡張

Message Routing サンプルの ESQL に変更を加えることにより、他のメッセージ・フローでも使用できるようになります。

Routing_using_database_and_memory_cache メッセージ・フローの再利用

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

Routing_using_database_and_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. 変数の設定中に問題が発生した場合は、デフォルト値が設定されます。 サンプルでは、これらの値は default に設定されています。

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

ESQL を使用する際には、Compute ノード・プロパティーの「計算モード」が以下のいずれかの値に設定されていることを確認する必要があります。設定されていない場合、ルーティング情報は失われます。

また、データベース ODBC ソース名「データ・ソース」を Compute ノード・プロパティーに追加する必要もあります。

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

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

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

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

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

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

Routing_using_database_and_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. 外部変数をメッセージ・フロー・レベルで定義する必要があります。
    1. メッセージ・フロー Routing_using_database_and_memory_cache を開き、メッセージ・フロー・エディターの下部にある「ユーザー定義プロパティー」タブをクリックします。
    2. Variable1 という新しいプロパティーを作成し、そのデフォルト値を SAMPLE_QUEUES に設定します。

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

  3. これで変数 Variable1 は外部変数になります。
    1. メッセージ・フローをブローカー・アーカイブ (BAR) ファイルに追加して、「構成」タブをクリックします。
    2. フロー内の 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;

サンプルのホームに戻る