Message Routing 样本显示了如何使用数据库表或文件来存储信息,消息流可以使用该信息将消息路由至 WebSphere MQ 队列。此方法是在消息流 Compute 节点中创建硬编码路由信息的备选方式。
使用数据库表或文件都是将任何形式的路由或变换数据存储在 IBM Integration Bus 中的方法。这些方法具有以下优点:
使用数据库或文件存储此信息的一个问题是,消息通过消息流传递时每次访问数据库或文件会产生性能开销。
可以使用共享变量来解决此问题。您可以使用共享变量在消息流中存储状态,以供使用该流的所有消息使用。如何使用共享变量的确切详细信息可在 IBM Integration Bus 文档中的 DECLARE 语句内找到。通过使用共享变量,可以将来自数据库表或文件的信息存储在消息流的内存中。此方法免去了继续访问数据库表或文件的需求,并且几乎提供使用数据库表或文件的所有优势而不产生性能开销。但是,高速缓存不会在数据库表或文件发生更改时提取这些更改。要提取更改,您必须重新启动消息流或向消息流添加刷新机制。
Message Routing 样本显示了如何使用数据库表或文件在消息流中路由消息,以及消息流如何使用共享变量存储数据库表或文件。它还显示了如何通过重新启动消息流或向消息流发送刷新消息来刷新高速缓存的数据库表。
该样本消息流从 WebSphere MQ 队列读取消息,根据数据库表中的数据创建目标列表,然后将消息传递给目标列表中的条目。

显示如何使用以共享变量存储的高速缓存版本的数据库表路由消息的样本。该消息流有两个主要的子流。第一个子流给出了与 Routing_using_database_table 消息流相同的功能,但使用的是共享变量。第二个子流用于刷新共享内存变量。

下面三个方案说明如何使用 FileRead 节点来路由消息。 第一个方案使用 XML 格式的文件,第二个和第三个方案使用以逗号分隔的值 (CSV) 格式的文件。 显示的格式是示例。无论是在整个文件中读取还是从文件中选择单一记录,您都可以使用任何文件格式。
此消息流从 WebSphere MQ 队列读取消息。接着,将读取整个文件并根据此文件的内容创建目标列表。 在此方案中,文件是 XML 格式的。 消息将路由到目标列表中的条目。

此样本中的 FileRead 节点使用 XPath 表达式根据入局消息中的关键字在文件中查找正确的记录。此方案中使用的文件包含 CSV 格式的记录。 消息集用来对文件中的每个记录进行建模。 记录中的路由信息将直接复制到目标数据列表以供 MQOutput 节点直接使用。因此,不需要进行其他处理(例如,由 Compute 节点处理)。

此流将扩展先前的流,方法是显示如何使用 ESQL 共享变量对文件中的信息进行高速缓存。附加的子流将刷新共享变量高速缓存。

可以在 FileRead 节点的“结果”选项卡上设置以下三个 XPath 表达式:
| 属性 | 表达式 | 说明 |
|---|---|---|
| 结果数据位置 | $ResultRoot/MRM/data | 在选定的记录中,此字段用来对消息进行增补。 此字段的内容将复制到输出数据位置。 |
| 输出数据位置 | $OutputLocalEnvironment/Destination/MQ | |
| 记录选择表达式 | (concat( $InputRoot/XMLNSC/SaleEnvelope/SaleList/Invoice/Initial[1], $InputRoot/XMLNSC/SaleEnvelope/SaleList/Invoice/Initial[2] ) = $ResultRoot/MRM/Initial ) AND ($InputRoot/XMLNSC/SaleEnvelope/SaleList/Invoice/Surname = $ResultRoot/MRM/Surname) |
此表达式的第一部分用于连接消息中的两个首字母。 此表达式的第二部分用于获取消息的名称部分。 将传播与首字母和名称匹配的记录。 |
用于驱动 Message Routing 样本的测试消息是一个包含客户发票详细信息的 XML 消息。
<SaleEnvelope>
<Header>
<SaleListCount>1</SaleListCount>
</Header>
<SaleList>
<Invoice>
<Initial>T</Initial>
<Initial>D</Initial>
<Surname>Montana</Surname>
<Item><Code>00</Code>
<Code>01</Code><Code>02</Code>
<Description>Twister</Description>
<Category>Games</Category>
<Price>00.30</Price>
<Quantity>01</Quantity>
</Item>
<Item>
<Code>02</Code><Code>03</Code><Code>01</Code>
<Description>The Times Newspaper</Description>
<Category>Books and Media</Category>
<Price>00.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>00.50</Balance>
<Currency>Sterling</Currency>
</Invoice>
</SaleList>
<Trailer>
<CompletionTime>12.00.00</CompletionTime>
</Trailer>
</SaleEnvelope>
首字母和名称字段用于执行查找,以便为每个客户找到目标队列。
样本消息流使用与获取路由信息相同的数据库表。该数据库表包含五列:前三列包含从入局消息派生的查找信息,后两列包含消息将路由至的队列和队列管理器的详细信息。这些列将显示在下表中:
| 列 | 描述 |
|---|---|
| Variable1 | 用于查找目标队列的第一个变量(样本中的此变量是硬编码的,且并非派生自 XML 消息)。 |
| Variable2 | 用于查找目标队列的第二个变量(此变量通过使用首字母字段从 XML 消息派生而来)。 |
| Variable3 | 用于查找目标队列的第三个变量(此变量通过使用名称字段从 XML 消息派生而来)。 |
| Queue_manager | 目标队列管理器名称。 |
| Queue_name | 目标队列名称。 |
数据库表的定义是在样本消息流项目的 Database 目录中提供的。数据库表不直接链接入局 XML 消息,因此可以对不同的路由消息复用此表。如果数据库表直接链接入局 XML 消息,那么第一个变量可以用于区分使用同一张表的不同节点。
每个消息流的 Compute 节点都包含详细的 ESQL 注释,以确切说明完成了哪些操作来达到必需的行为:
查看数据库内容的方式取决于安装了哪些数据库产品。 对于 DB2 数据库,请使用 DB2 提供的工具;例如,DB2 控制中心。
此消息流中使用了两个 XML 文件。这两个文件具有同一结构,但其中一个文件包含消息的多个目标。XML 文件具有两个元素:
这些消息流使用 CSV 文件。此文件包含多个记录,每个记录具有四个元素:
消息流的每个 Compute 节点都包含详细的 ESQL 注释,以确认说明执行了哪些操作来实现必需的行为:
下图显示用于消息流 Routing_using_records_file 和 Routing_using_file_memory_cache 的消息集。
您可以在消息集中查看 CSV 文件中显示的各个字段。 对于消息将发送到的每个目标队列,DestinationData 元素重复出现一次。