通过使用 DatabaseInput 节点,您可以创建消息流,这些消息流会对保存在数据库中的应用程序数据所发生的更改快速作出反应。此节点直接从数据库检索发生更新的数据。
下图显示了事件的序列。在应用程序数据表中引入更改后,触发器将受到触发,将使用足够的信息来填充事件表,以确定发生更改的行。
此样本中使用的应用程序数据表的结构如下图所示:
例如,如果将条目插入客户表,那么在客户表和事件表中插入的行将如下表所示。
| PKEY | FIRSTNAME | LASTNAME | CCODE |
|---|---|---|---|
| cust1 | Joe | Bloggs | sales |
事件表是由用户创建的为应用程序表存储事件的数据库表,通常与这些应用程序表位于同一模式中。 事件表描述了对应用程序表所作更改的类型以及发生更改的行的标识。下表显示了事件表中一些典型列以及包括这些列的原因。
| 列名 | 列功能 | 示例值 |
|---|---|---|
| EVENT_ID | 必填。用于标识在任意给定时间进行处理的主键。 | 1 |
| OBJECT_KEY | 必填。在应用程序表中发生更改的行的识别元素,通常是主键列中的行的元素。 | cust1 |
| OBJECT_VERB | 选填。所执行的更改,通常是 CREATE、UPDATE 或 DELETE 之一。此事件用于区分 DELETE 事件,因为在此情况下,应用程序表在流的消息构建时不包含要检索的行。 | CREATE |
| OBJECT_NAME | 选填。发生更改的应用程序表的名称。如果 DatabaseInput 节点用于支持多个应用程序表的更新,那么此列为必填的列。 | 客户 |
| EVENT_PRIORITY | 选填。事件的优先级,例如,此列可以用于确保优先级的值较高的事务的计算比较优先。 | 1 |
| EVENT_TIME | 选填。执行操作的时间。通常用于流的记录或性能监控。 | 2010-10-19T17:10:00 |
| EVENT_STATUS | 选填。用于确定此事件是否已处理。如果在处理后未对事件进行删除或归档,那么此列为必填的列。 | 0 |
| EVENT_COMMENT | 选填。自由格式字段,例如,如果处理后未删除事件,那么此列可以用于存储消息处理的结果。 | 已处理,但期间发生异常 |
注意:
以下是仅带有三列的基本事件表的示例。 对应用程序表执行添加操作将导致在事件表中出现以下新行:
| EVENT_ID | OBJECT_KEY | OBJECT_VERB |
|---|---|---|
| 1 | cust1 | CREATE |
已创建主键为 cust1 的新客户。DatabaseInput 节点将对更改作出响应,并处理消息流中的新行。
流完成事件的处理后,将使用下列三种方式其中一种方式来完成处理:
此样本使用第一种方式,在成功完成后删除事件。
下列各节显示了有关消息流及其执行的处理的详细信息:
DatabaseInput 消息流将更改传递到数据库,将更改映射为输出消息格式并置于 WebSphere MQ 队列上:
请注意,此流包括第二个 MQOutput 节点来捕获可能发生的异常。此操作将避免不必要的重试以及格式错误的 ESQL 或错误设置的数据库或表的重复处理。
此样本中使用了三个 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';