DatabaseInput ノードを使用して、データベースに保持されているアプリケーション・データの変更に迅速に反応するメッセージ・フローを作成できます。 このノードは、データベースから更新済みデータを直接取得します。
次の図は、イベントのシーケンスを示しています。アプリケーション・データ表に変更が導入されると、トリガーが起動され、変更された行を判別するのに必要な情報がイベント表に取り込まれます。
このサンプルで使用されるアプリケーション・データ表の構造を、次の図に示します。
例えば、顧客表に項目が挿入される場合、顧客表とイベント表の挿入行は、次の表のようになります。
PKEY | FIRSTNAME | LASTNAME | CCODE |
---|---|---|---|
cust1 | Joe | Bloggs | sales |
イベント表は、ユーザーが作成するデータベース表で、通常はイベントを格納するアプリケーション表と同じスキーマ内に存在します。 イベント表は、アプリケーション表に加えられた変更のタイプ、および変更された行の ID を記述します。以下の表は、イベント表の一般的な列のいくつか、およびそれが含まれる理由を示します。
列名 | 列の機能 | サンプル値 |
---|---|---|
EVENT_ID | 必須。どのイベントが任意の指定時間に処理中であるかを識別する 1 次キー。 | 1 |
OBJECT_KEY | 必須。アプリケーション表の変更された行の識別エレメント。通常は 1 次キー列の行のエレメントです。 | cust1 |
OBJECT_VERB | オプション。 実行された変更。通常は CREATE、UPDATE、または DELETE のいずれかです。このイベントは、DELETE イベントの識別に使用されます。これは、この場合では、フローのメッセージが作成されたときに、アプリケーション表に取得する行が含まれていないためです。 | CREATE |
OBJECT_NAME | オプション。 変更されたアプリケーション表の名前。この列は、複数のアプリケーション表の更新をサポートするために DatabaseInput ノードを使用している場合に必要になります。 | customer |
EVENT_PRIORITY | オプション。 イベントの優先度。例えば、優先度の高いトランザクションが、優先度の値の低いものより前に計算されるようにするために使用できます。 | 1 |
EVENT_TIME | オプション。 操作が実行された時刻。通常、フローのロギングまたはパフォーマンス・モニターのために使用されます。 | 2010-10-19T17:10:00 |
EVENT_STATUS | オプション。 イベントが既に処理されたかどうかを判別するために使用されます。イベントが削除されない、または処理後アーカイブされる場合に必要になります。 | 0 |
EVENT_COMMENT | オプション。 フリー・フォーム・フィールド。例えば、イベントが処理後削除されなかった場合に、メッセージ処理の結果を保管するために使用できます。 | 処理時に例外が発生します。 |
注:
以下の例のイベント表は、3 つの列だけのきわめて基本的なものです。 アプリケーション表に追加すると、イベント表に以下の新しい行が追加されます。
EVENT_ID | OBJECT_KEY | OBJECT_VERB |
---|---|---|
1 | cust1 | Create |
主キー cust1 を持つ新しい顧客が作成されました。DatabaseInput ノードは変更に反応し、メッセージ・フロー内の新しい行を処理します。
フローでイベントの処理が完了した場合、処理を完了するために以下の 3 つの方法のいずれかが使用されます。
このサンプルでは最初のオプションを使用し、処理が正常に完了したら、イベントを削除します。
メッセージ・フローとそれが実行する処理の詳細は、次のセクションで示します。
DatabaseInput メッセージ・フローは、データベースの変更を取得し、それを出力メッセージ・フォーマットにマップして WebSphere MQ キューに入れます。
フローには、発生する可能性がある例外をキャッチするための 2 番目の MQOutput ノードが含まれています。 このアクションにより、誤った形式の ESQL の不必要な再試行や反復処理、またはデータベースや表の誤ったセットアップが回避されます。
このサンプルでは、3 つの SQL スクリプトが使用されます。
INSERT INTO DBINPUT_CUSTOMER VALUES ('cust1', 'Fred', 'Flintstone', 'Dev');
UPDATE DBINPUT_CUSTOMER SET FIRSTNAME = 'Barney', LASTNAME = 'Rubble' WHERE PKEY='cust1';
DELETE FROM DBINPUT_CUSTOMER WHERE PKEY='cust1';