このトピックでは、BLOB ドメインに属し、 BLOB パーサーによって構文解析されるメッセージを処理する場合の情報が提供されます。
BLOB メッセージには事前定義された構造がないため、BLOB メッセージの内容を操作することはできません。 ただし、その内容を、ビット・ストリーム内の既知の位置を使用して参照すること、 またそのメッセージをその内容に関する最小の知識で処理することは可能です。
BLOB メッセージ本文パーサーがツリー構造を作成する方法は、他のメッセージ本文パーサーとは違います。 このツリー構造にはルート・エレメント BLOB があり、 データを含む子エレメントがあります (これも BLOB と呼ばれる)。
BLOB データ内の情報の特定の部分の位置がわかっている場合、サブストリングを使用してメッセージの内容を参照できます。 たとえば、以下の式は、メッセージ本文の 10 番目のバイトを識別します。
InputBody.BLOB.BLOB[10]
以下の式は、オフセット 10 から始まる 10 バイトのメッセージ・データを参照します。
SUBSTRING(InputBody.BLOB.BLOB from 10 for 10)
この例は、可変長 BLOB メッセージの操作方法を示すものです。 この例は、可変長 BLOB メッセージを受信するメッセージ・フローを構成しており、 MRM パーサーの起動によってフィールドのいくつかを構文解析し、 解析された情報に基づいて正しい出力キューに出力メッセージを経路指定することを前提としています。
入力メッセージは BLOB 形式であり、組み込み NULL ('x00') が含まれていることが前提です。したがって、 そのメッセージをヌル終了ストリングとして定義することはできません。
この例では、次のような ESQL を示します。
これにより、BLOB メッセージの前に整数の長さフィールドを付けたメッセージ・モデルとして定義できるようになります。
さらにこの例では、この BLOB メッセージを CWF に変換し、 メッセージを処理して、付加された長さフィールドを除去する方法も示されています。
この例の入力レコードの形式は、次のとおりです。
このフィールドは、 顧客の定義する基準に基づいて異なる複数のキューにメッセージを送るための整数値として使用されます。
以下のエレメントおよびタイプを組み込んだ、新規メッセージ BLOB_Example の定義
ここでは、メッセージ・フローの特性について説明します。 この例のフローをインプリメントしたい場合には、メッセージ・フローの定義を完了し (たとえば、3 つのサブフローを作成して、 偽の、不明な、および障害のケースを扱うために ここで使用されている出力ノードと取り替えることにより)、 またそのメッセージ・フローのデプロイメントおよび実行に必要なサポートを提供する (たとえば、 そのフローをデプロイするブローカーのためのキュー・マネージャーに インバウンドおよびアウトバウンド・キューを作成する) 必要があります。
-- Declare local variables DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); DECLARE MSGLEN CHARACTER; DECLARE NUMBER INTEGER; DECLARE RESULT INTEGER; DECLARE REM INTEGER; -- Copy message headers WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; -- -- Set MSGLEN to non NULL to avoid errors when concatenating the first time -- SET MSGLEN = 'X'; -- -- Get the length of the BLOB and substract the length of VERSION_NUM and STORE_NUM (11+10) SET NUMBER = LENGTH("InputRoot"."BLOB"."BLOB")-21; -- -- Convert NUMBER to hexadecimal. The remainder of dividing by 16 is calculated recursively. -- WHILE NUMBER > 15 DO SET RESULT = NUMBER/16; SET REM = NUMBER - RESULT*16; SET MSGLEN = CASE WHEN REM < 10 THEN CAST(REM AS CHARACTER) || MSGLEN WHEN REM = 10 THEN 'A' || MSGLEN WHEN REM = 11 THEN 'B' || MSGLEN WHEN REM = 12 THEN 'C' || MSGLEN WHEN REM = 13 THEN 'D' || MSGLEN WHEN REM = 14 THEN 'E' || MSGLEN ELSE 'F' || MSGLEN END; SET NUMBER = RESULT; END WHILE; SET REM = NUMBER; SET MSGLEN = CASE WHEN REM < 10 THEN CAST(REM AS CHARACTER) || MSGLEN WHEN REM = 10 THEN 'A' || MSGLEN WHEN REM = 11 THEN 'B' || MSGLEN WHEN REM = 12 THEN 'C' || MSGLEN WHEN REM = 13 THEN 'D' || MSGLEN WHEN REM = 14 THEN 'E' || MSGLEN ELSE 'F' || MSGLEN END; -- -- Add leading '0's up to a length of 9 to be able to cast as BLOB. -- Remember it started with MSGLEN set to X (length 1) WHILE LENGTH(MSGLEN) < 9 DO SET MSGLEN = '0' || MSGLEN; END WHILE; -- -- Change to appropriate endian (PLATFORM DEPENDENT) -- If no endian swapping needed then remember to get rid of the last character as below -- SET MSGLEN = SUBSTRING(MSGLEN FROM 1 FOR 8); -- SET MSGLEN = SUBSTRING(MSGLEN FROM 7 FOR 2) || SUBSTRING(MSGLEN FROM 5 FOR 2) || SUBSTRING(MSGLEN FROM 3 FOR 2) || SUBSTRING(MSGLEN FROM 1 FOR 2); SET "OutputRoot"."BLOB"."BLOB" = CAST(MSGLEN AS BLOB) || "InputRoot"."BLOB"."BLOB";
CAST("Body"."e_STORE_NUM" AS INTEGER) < 151
このステートメントは、「Store Number (店舗番号)」からの入力メッセージが 151 未満であり、 特定のキューにルーティングされるという前提に基づいています。 他のどんな適切なテストをもコーディングすることができます。
このサブフローは期待される形式 (Filter ノードで実行されたテストが true を戻した) を持つメッセージを扱います。障害のないメッセージは、出力キューにその元の形式で 書き込まれます。メッセージは MRM から変換されて BLOB に戻り、 付加した 4 バイト (フィールド B_LEN) が除去されます。
このサブフローについて、
-- Copy message headers DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; -- -- Remove the 4 bytes length field added previously -- SET "OutputRoot"."BLOB"."BLOB" = SUBSTRING("InputRoot"."BLOB"."BLOB" FROM 5);
BLOB メッセージの操作をサポートするため、その先頭に付加した 4 バイトが この Compute ノードにより除去されます。
メッセージの既存ヘッダーの基数値に初期設定されている、変数 J の使用に注意してください。これは、以下の WHILE 文をコーディングする場合に起こる、ループのそれぞれの反復上での基数の計算より効率的です。
WHILE I < CARDINALITY(InputRoot.*[]) DO
関連概念
メッセージ・フロー
BLOB パーサーおよびドメイン
プロモートされたプロパティー
ESQL
メッセージのモデル化
関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
ノードの構成
ESQL ファイルの管理
プロモートされたプロパティーの定義
関連資料
Compute ノード
Database ノード
Filter ノード
MQInput ノード
MQOutput ノード
ResetContentDescriptor ノード
ESQL
CARDINALITY 関数
CASE 関数
CAST 関数
DECLARE ステートメント
SET ステートメント
SUBSTRING 関数
WHILE ステートメント
注意 |
商標 |
ダウンロード |
ライブラリー |
技術サポート |
フィードバック
![]() ![]() |
ac11640_ |