Message Routing サンプルの ESQL は、ほんの少し変更を加えるだけで、他のメッセージ・フローで使用できるような設計に なっています。
ESQL ファイル Routing_using_memory_cache には、キャッシュを使用する バージョンのサンプルで使用されるすべての ESQL が含まれています。 このファイルを開き、以下のセクション (ESQL で Section 1 というマークが付けられている) を探してください。
ESQL によって経路指定されることになるメッセージを基に、強調表示されている 3 つの部分 (Section 1、2、および 3) を変更する必要があります。
別のメッセージ・フローで経路指定機能を提供するためにこの ESQL を再利用するときには、残りの部分を未変更のままにしておくことができます。データベース表は、新しいフローに必要な新規エントリーを追加して、更新する必要があります。メッセージ・フロー・プロジェクトのサンプルと共に提供されている、データ・スクリプト setupRoutingDatabase を参照してください。
ESQL を使用する際に行うべき 1 つの重要なことは、Compute ノード・プロパティーのモードが以下の値のいずれかに設定されて いるかどうかを確認することです。 設定されていない場合はルーティング情報が失われます。
データベース ODBC ソース名も Compute ノード・プロパティーに追加しなければなりません。
BEGIN ATOMIC ... END; ステートメントは、一度に 1 つのスレッドのみがメモリー・キャッシュを使用するようにする ため、Routing_using_memory_cache メッセージ・フローで使用されます。 ESQL のこの部分の単一スレッドの制限が重要なのは、キャッシュを動的にリフレッシュする場合だけです。 メッセージ・フローの存続期間中にキャッシュのリフレッシュの必要がないと判断するのであれば、キャッシュの初期化だけを カバーするよう、atomic ブロックの有効範囲を小さくできます。 次の図は、現在の ESQL (ESQL で Section 4 というマークが 付けられている) を示しています。
この変更を加えた後、キャッシュ内のキュー名の検索は単一スレッドではなくなります。複数の異なるメッセージが同時にキャッシュから読み取りを行えるようになります。
外部変数を使うと、メッセージ・フロー内のハードコーディングされた値がメッセージ・フロー・レベルにプロモートされ、デプロイ時にそれらを変更できるようになります。デプロイ時に、デプロイ先の環境に合わせてメッセージ・フローをカスタマイズできます。これは、メッセージ・フローの ESQL に変更を加えることなく、行えます。
Routing_using_memory_cache メッセージ・フローには、Variable1 という変数があります。この変数はデータベース検索を行うために使用されます。これは、値 SAMPLE_QUEUES
にハードコーディングされています。デプロイ時にこの変数を外部化し、デプロイ先のシステムに応じて値を変更できるようにするのは意味のあることです。これにより、システムごとに異なるキューとキュー・マネージャーのセットを使用しながら、それでもなお同一のデータベース表を使用することが可能になります。
Variable1 を外部変数にするには次のようにします。
-- Section 1
DECLARE Variable1 EXTERNAL CHAR 'SAMPLES_QUEUES';
DECLARE Variable2 CHAR;
DECLARE Variable3 CHAR;
この外部変数を使用するには、Variable1 のさまざまなパラメーターの入った、ROUTING データベースの ROUTING_TABLE 表に新規エントリーを作成する必要があります。Variable1 の値を変更せずにこのフローをデプロイすると、フローの機能は今までと同じです。(Variable1 はデフォルトで SAMPLE_QUEUES になります)
データベース表の Message Routing サンプル・キャッシュについての現行リフレッシュ基準は次のとおりです。
キャッシュのリフレッシュのタイミングを決定する際、他の基準も使用できると便利です。 以下の基準が使用できます。
サンプルは、これらのいずれかの基準を使用するように、容易に変更することができます。 キャッシュのリフレッシュに関する ESQL での重要箇所は次のとおりです。
60 秒の期間を使用するようにリフレッシュ基準を変更するには、以下を行います。
IF CacheQueueTable.LastUpDate is null or (CURRENT_TIMESTAMP - CacheQueueTable.LastUpDate) second > INTERVAL '60' SECOND THEN
SET CacheQueueTable.LastUpDate = CURRENT_TIMESTAMP;
メッセージの数が 100 に達するとリフレッシュ基準が true になるように変更するには、次のようにします。
IF CacheQueueTable.MessageCount is null or CacheQueueTable.MessageCount > 100 SECOND THEN
SET CacheQueueTable.MessageCount = 0;
SET CacheQueueTable.MessageCount = CacheQueueTable.MessageCount +1;