使用 BizTalk Server 以增量方式接收 Oracle 数据库更改通知

重要

为简洁起见,本主题仅介绍如何以增量方式接收通知。 在业务方案中,业务流程在理想情况下必须包含逻辑,以提取收到的通知消息类型,然后执行任何后续操作。 换句话说,本主题中所述的业务流程必须基于处理通知消息中所述的业务流程构建,以便使用 BizTalk Server 在 Oracle 数据库中完成特定任务

本主题演示如何配置 Oracle 数据库适配器以接收来自 Oracle 的增量查询通知消息。 为了演示增量通知,我们考虑一个表 ACCOUNTACTIVITY,其中包含“已处理”列。 向此表插入新记录时,“已处理”列的值将设置为“n”。 可以通过执行以下操作将适配器配置为接收增量通知:

  • 使用 SELECT 语句注册通知,该语句检索“已处理”列为“n”的所有记录。 为此,可以为 NotificationStatement 绑定属性指定 SELECT 语句。

  • 对于已通知的行,请将“已处理”列更新为“y”。

    本主题演示如何创建 BizTalk 业务流程并配置 BizTalk 应用程序来实现此目的。

使用 Oracle 数据库适配器绑定属性配置通知

下表汇总了用于配置从 Oracle 数据库接收通知的 Oracle 数据库适配器绑定属性。 在 BizTalk Server 管理控制台中配置接收端口时,必须指定这些绑定属性。

注意

在生成 通知 操作的架构时,可以选择指定这些绑定属性,即使这不是必需的。 如果这样做,使用适配器服务外接程序作为元数据生成的一部分生成的端口绑定文件也会包含为绑定属性指定的值。 稍后可以在 BizTalk Server 管理控制台中导入此绑定文件,以创建 WCF 自定义或 WCF-OracleDB 已设置绑定属性的接收端口。 有关使用绑定文件创建接收端口的详细信息,请参阅 使用到 Oracle 数据库的端口绑定文件配置物理端口绑定

Binding 属性 说明
InboundOperationType 指定要执行的入站操作。 若要接收通知消息,请将此项设置为 “通知”。
NotificationPort 指定 ODP.NET 必须打开才能侦听 Oracle 数据库中的数据库更改通知的端口号。
NotificationStatement 指定用于注册查询通知的 SELECT 语句。 仅当指定 SELECT 语句的结果集发生更改时,适配器才会收到通知消息。
NotifyOnListenerStart 指定在启动侦听器时适配器是否向适配器客户端发送通知。

有关这些属性的更完整说明,请参阅 使用适用于 Oracle 数据库绑定属性的 BizTalk 适配器。 有关如何使用 Oracle 数据库适配器接收来自 Oracle 数据库的通知的完整说明,请进一步阅读。

本主题如何演示接收通知消息

在本主题中,为了演示 Oracle 数据库适配器如何支持从 Oracle 数据库接收增量数据库更改通知消息,我们将配置适配器以接收对 ACCOUNTACTIVTY 表所做的更改的通知。 假设 ACCOUNTACTIVITY 表具有列“TID”、“Account”和“已处理”。 每当添加新记录时,“已处理”列的值将设置为“n”。 因此,若要获取增量通知,必须在 BizTalk 业务流程中执行以下任务:

  • 获取“已处理”为“n”的所有记录的通知。 可以通过将 SELECT 语句指定为通知语句来执行此操作。

  • 收到特定记录的通知后,将“已处理”设置为“y”。 为此,可以执行存储过程PROCESS_RECORDS,以更新“已处理”列。

    为了演示如何接收增量通知,我们执行以下操作:

  • 通知 (入站操作) 生成架构,并在 ACCOUNTACTIVITY 表上 PROCESS_RECORDS (出站操作) 。

  • 创建具有以下项的业务流程:

    • 用于接收通知消息的接收位置。 可以通过将 SELECT 语句指定为以下内容来配置通知:

      SELECT TID,ACCOUNT,PROCESSED FROM SCOTT.ACCOUNTACTIVITY WHERE PROCESSED = ‘n’
      

      注意

      必须指定表名称和架构名称。 例如,SCOTT.ACCOUNTACTIVITY

    • 用于更新已为其发送通知的行的发送端口。 你将在此端口上执行PROCESS_RECORDS存储过程,将接收通知的记录的“已处理”列的值设置为“y”。

      请注意,必须在收到通知消息后执行此操作,以便更新处理的行。 为了消除等待获取通知响应,然后手动删除请求消息以执行PROCESS_RECORDS过程的开销,你将在业务流程本身中为PROCESS_RECORDS过程生成请求消息。 为此,可以使用业务流程中的 “构造消息” 形状。

如何从 Oracle 数据库接收通知消息

使用具有 BizTalk Server 的 Oracle 数据库适配器对 Oracle 数据库执行操作涉及构建基块以使用 Oracle 数据库开发 BizTalk 应用程序中所述的过程任务。 若要将适配器配置为接收通知消息,这些任务包括:

  1. 创建 BizTalk 项目,然后为 ACCOUNTACTIVITY 表上的“通知 (入站操作) 和 PROCESS_RECORDS 过程 (出站操作) 生成架构。 (可选)可以为 InboundOperationTypeNotificationPortNotificationStatement 绑定属性指定值。

  2. 在 BizTalk 项目中创建一条消息,用于从 Oracle 数据库接收通知。

  3. 在 BizTalk 项目中创建消息,用于执行PROCESS_RECORDS存储过程和接收响应消息。

  4. 创建执行以下操作的业务流程:

    • 从 Oracle 数据库接收通知消息。

    • 创建消息以执行PROCESS_RECORDS过程。

    • 将此消息发送到 Oracle 数据库,以选择和更新记录并接收响应。

  5. 生成和部署 BizTalk 项目。

  6. 通过创建物理发送和接收端口来配置 BizTalk 应用程序。

    注意

    对于入站操作(如接收通知消息),必须仅配置单向 WCF-Custom 或 WCF-OracleDB 接收端口。 入站操作不支持双向接收端口。

  7. 启动 BizTalk 应用程序。

    本主题提供有关执行这些任务的说明。

生成架构

必须为 通知 操作和 PROCESS_RECORDS 过程生成架构。 有关如何生成架构的详细信息,请参阅 在 Visual Studio 中检索 Oracle 操作的元数据 。 生成架构时执行以下任务。 如果不想在设计时指定绑定属性,请跳过第一步。

  1. 在生成架构时,指定 InboundOperationTypeNotificationPortNotificationStatement 绑定属性的值。 有关此绑定属性的详细信息,请参阅 使用适用于 Oracle 数据库绑定属性的 BizTalk 适配器。 有关如何指定绑定属性的说明,请参阅 指定绑定属性

  2. 选择协定类型作为 服务 (入站操作)

  3. 通知 操作生成架构。

  4. 选择协定类型作为 客户端 (出站操作)

  5. PROCESS_RECORDS 过程生成架构。 此过程在 ACCOUNT_PKG 包下提供。

定义消息和消息类型

前面生成的架构描述了业务流程中的消息所需的“类型”。 消息通常是一个变量,其类型由相应的架构定义。 生成架构后,必须将其链接到 BizTalk 项目的业务流程视图中的消息。

对于本主题,必须创建三条消息:一个用于接收来自 Oracle 数据库的通知,一个用于执行PROCESS_RECORDS过程,一个用于接收过程的响应。

执行以下步骤以创建消息并将其链接到架构。

  1. 将业务流程添加到 BizTalk 项目。 在解决方案资源管理器中,右键单击 BizTalk 项目名称,指向“添加”,然后单击“新建项”。 键入 BizTalk 业务流程的名称,然后单击“ 添加”。

  2. 打开 BizTalk 项目的业务流程视图窗口(如果尚未打开)。 单击“ 视图”,指向“ 其他窗口”,然后单击“ 业务流程视图”。

  3. 业务流程视图中,右键单击“ 消息”,然后单击“ 新建消息”。

  4. 右键单击新创建的消息,然后选择“ 属性窗口”。

  5. Message_1的“属性”窗格中,执行以下操作:

    使用此选项 要执行此操作
    标识符 键入 NotifyReceive
    消息类型 从下拉列表中,展开“ 架构”,然后选择“ OracleNotifyIncremental.OracleDBBinding.Notification”,其中 OracleNotifyIncremental 是 BizTalk 项目的名称。 OracleDBBinding 是为 通知 操作生成的架构。
  6. 重复步骤 3 以创建两个新消息。 在新邮件的“ 属性 ”窗格中,执行以下操作:

    将“标识符”设置为 将“消息类型”设置为
    过程 OracleNotifyIncremental.OracleDBBinding1.PROCESS_RECORDS,其中 OracleDBBinding1 是为 PROCESS_RECORDS 过程生成的架构。
    ProcedureResponse OracleNotifyIncremental.OracleDBBinding1.PROCESS_RECORDSResponse

设置业务流程

必须创建 BizTalk 业务流程才能使用 BizTalk Server 从 Oracle 数据库接收通知消息,然后更新接收通知的行。 在此业务流程中,适配器根据为 NotificationStatement 绑定属性指定的 SELECT 语句接收通知消息。 通知消息在文件位置接收。 收到响应后,业务流程会构造一条消息来调用PROCESS_RECORDS过程,该过程会更新接收通知的行。 此消息的响应也在同一 FILE 位置收到。

因此,业务流程必须包含以下项:

  • 用于接收通知消息的单向 WCF-Custom 或 WCF-OracleDB 接收端口。

  • 双向 WCF-Custom 或 WCF-OracleDB 发送端口以发送消息以执行PROCESS_RECORDS过程。

  • 构造消息形状,用于构造消息,以在业务流程中执行PROCESS_RECORDS过程。

  • 用于保存通知消息和PROCESS_RECORDS过程的响应的 FILE 发送端口。

  • 接收和发送形状。

    示例业务流程类似于以下内容。

    从 Oracle 接收通知的业务流程

添加消息形状

请确保为每个消息形状指定以下属性。 “形状”列中列出的名称是刚才提到的业务流程中显示的消息形状的名称。

形状 形状类型 属性
ReceiveNotification 接收 - 将 Name 设置为 ReceiveNotification

- 将 “激活” 设置为 “True”
SaveNotification 发送 - 将 Name 设置为 SaveNotification
SendProcMessage 发送 - 将 Name 设置为 SendProcMessage
ReceiveProcResponse 接收 - 将 Name 设置为 ReceiveProcResponse
SaveProcResponse 发送 - 将 Name 设置为 SaveProcResponse

添加构造消息形状

可以使用 “构造消息” 形状在业务流程中生成请求消息,以执行PROCESS_RECORDS过程。 为此,必须将 “构造消息” 形状和该 消息分配 形状添加到业务流程中。 在此示例中, “消息分配” 形状调用生成消息的代码,该消息将发送到 Oracle 数据库以执行该过程。 消息 分配 形状还设置要发送到 Oracle 数据库的消息的操作。

对于构造消息形状,将 Message Constructed 属性设置为 Procedure

生成响应的代码可以是 BizTalk 项目所在的同一 Visual Studio 解决方案的一部分。 生成响应消息的示例代码如下所示。

namespace SampleMessageCreator
{
    public class SampleMessageCreator
    {
        private static XmlDocument Message;
        private static string XmlFileLocation;
        private static string ResponseDoc;

        public static XmlDocument XMLMessageCreator()
        {
            XmlFileLocation = "C:\\TestLocation\\MessageIn";
            try
            {
                ResponseDoc = (Directory.GetFiles(XmlFileLocation, "*.xml", SearchOption.TopDirectoryOnly))[0];
            }
            catch (Exception ex)
            {
                Console.WriteLine("Trying to get XML from: " + XmlFileLocation);
                Console.WriteLine("EXCEPTION: " + ex.ToString());
                throw ex;
            }
            //Create Message From XML
            Message = new XmlDocument();
            Message.PreserveWhitespace = true;
            Message.Load(ResponseDoc);
            return Message;
        }
    }
}

为使上述代码摘录能够生成请求消息,必须在为 XmlFileLocation 变量指定的位置) PROCESS_RECORDS过程 (XML 请求消息。

注意

生成项目后,将在项目目录中创建 MessageCreator.dll。 必须将此 DLL 添加到全局程序集缓存 (GAC) 。 此外,必须将 MessageCreator.dll 添加为 BizTalk 项目中的引用。

添加以下表达式以从 消息分配 形状调用此代码并设置消息的操作。 若要添加表达式,请双击“ 消息分配” 形状以打开“表达式编辑器”。

Procedure = SampleMessageCreator.SampleMessageCreator.XMLMessageCreator();
Procedure(WCF.Action) = "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG/PROCESS_RECORDS";

添加端口

请确保为每个逻辑端口指定以下属性。 “端口”列中列出的名称是业务流程中显示的端口名称。

端口 属性
OracleNotifyPort - 将 标识符 设置为 OracleNotifyPort

- 将 Type 设置为 OracleNotifyPortType

- 将 通信模式 设置为 单向

- 将 通信方向 设置为 接收
SaveMessagePort - 将 标识符 设置为 SaveMessagePort

- 将 Type 设置为 SaveMessagePortType

- 将 通信模式 设置为 单向

- 将“通信方向”设置为“发送

- 创建操作 通知。 此操作用于通知消息。

- 创建操作 过程。 此操作用于选择响应消息。
OracleOutboundPort - 将 标识符 设置为 OracleOutboundPort

- 将 Type 设置为 OracleOutboundPortType

- 将 通信模式 设置为 请求-响应

- 将 “通信方向 ”设置为 “发送-接收”

指定操作形状的消息并连接到端口

下表指定应设置的属性及其值,以便为操作形状指定消息并将消息链接到端口。 Shape 列中列出的名称是前面提到的业务流程中显示的消息形状的名称。

形状 属性
ReceiveNotification - 将 Message 设置为 NotifyReceive

- 将 操作 设置为 OracleNotifyPort.Notify.Request
SaveNotification - 将 Message 设置为 NotifyReceive

- 将 操作 设置为 SaveMessagePort.Notify.Request
SendProcMessage - 将 消息 设置为 过程

- 将 操作 设置为 OracleOutboundPort.Procedure.Request
ReceiveProcResponse - 将 Message 设置为 ProcedureResponse

- 将 操作 设置为 OracleOutboundPort.Procedure.Response
SaveProcResponse - 将 Message 设置为 ProedureResponse

- 将 操作 设置为 SaveMessagePort.Procedure.Request

指定这些属性后,消息形状和端口将连接,并且业务流程完成。

现在,必须生成 BizTalk 解决方案并将其部署到BizTalk Server。 有关详细信息,请参阅 生成和运行业务流程

配置 BizTalk 应用程序

部署 BizTalk 项目后,前面创建的业务流程将列在 BizTalk Server 管理控制台的“业务流程”窗格下。 必须使用 BizTalk Server 管理控制台来配置应用程序。 有关演练,请参阅 演练:部署基本 BizTalk 应用程序

配置应用程序涉及:

  • 为应用程序选择主机。

  • 将业务流程中创建的端口映射到 BizTalk Server 管理控制台中的物理端口。 对于此业务流程,必须:

    • 定义物理 WCF-Custom 或 WCF-OracleDB 单向接收端口。 此端口侦听来自 Oracle 数据库的通知。 有关如何创建接收端口的信息,请参阅 手动配置到 Oracle 数据库适配器的物理端口绑定。 请确保为接收端口指定以下绑定属性。

      重要

      如果在设计时指定了绑定属性,则不需要执行此步骤。 在这种情况下,可以通过导入使用适配器服务外接程序创建的绑定文件来创建接收端口,并设置所需的绑定属性。 有关详细信息 ,请参阅使用到 Oracle 数据库的端口绑定文件配置物理端口绑定

      Binding 属性
      InboundOperationType 将此设置为 “通知”。
      NotificationPort 指定 ODP.NET 必须打开才能侦听 Oracle 数据库中的数据库更改通知的端口号。 将此设置为必须添加到 Windows 防火墙例外列表的相同端口号。 有关如何将端口添加到 Windows 防火墙例外列表的说明,请参阅 https://go.microsoft.com/fwlink/?LinkID=196959

      重要: 如果将此值设置为默认值 -1,则必须完全禁用 Windows 防火墙才能接收通知消息。
      NotificationStatement 将此设置为:

      SELECT TID,ACCOUNT,PROCESSED FROM SCOTT.ACCOUNTACTIVITY WHERE PROCESSED = ‘n’

      注意: 必须指定表名称和架构名称。 例如,SCOTT.ACCOUNTACTIVITY
      NotifyOnListenerStart 将此设置为 True

      有关不同绑定属性的详细信息,请参阅 使用适用于 Oracle 数据库绑定属性的 BizTalk 适配器

      注意

      建议在使用 Oracle 数据库适配器执行入站操作时配置事务隔离级别和事务超时。 为此,可以在配置 WCF-Custom 或 WCF-OracleDB 接收端口时添加服务行为。 有关如何添加服务行为的说明,请参阅 配置事务隔离级别和事务超时

    • 定义物理 WCF-Custom 或 WCF-OracleDB 发送端口以将消息发送到 Oracle 数据库以执行PROCESS_REOCRDS过程。 还必须在发送端口中指定操作。

    • 定义硬盘上的位置和相应的文件端口,BizTalk 业务流程将在其中删除 Oracle 数据库中的消息。 这些是从 Oracle 数据库接收的通知消息,以及通过 WCF-Custom 或 WCF-OracleDB 发送端口执行的PROCESS_RECORDS过程的消息。

启动应用程序

必须启动 BizTalk 应用程序,以便从 Oracle 数据库接收通知消息和执行PROCESS_RECORDS过程。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程

在此阶段,请确保:

  • WCF-Custom 或 WCF-OracleDB 单向接收端口,用于从正在运行的 Oracle 数据库接收通知消息。

  • 用于执行PROCESS_RECORDS过程的 WCF-Custom 或 WCF-OracleDB 发送端口正在运行。

  • 从 Oracle 数据库接收消息的 FILE 发送端口正在运行。

  • 操作的 BizTalk 业务流程正在运行。

执行操作

假设 ACCOUNTACTIVITY 表已包含一些记录。 此外,请确保要执行PROCESS_RECORDS过程的 XML 消息在 C:\TestLocation\MessageIn 中可用。 XML 文件应如下所示:

<PROCESS_RECORDS xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG"/>

启动 BizTalk 业务流程后,将按相同的顺序执行以下一组操作:

  • 适配器会收到类似于以下内容的通知消息:

    \<?xml version="1.0" encoding="utf-8" ?\>
    <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/">
      <Info>ListenerStarted</Info>
      <Source>OracleDBBinding</Source>
      <Type>Startup</Type>
    </Notification>
    

    此消息通知用于接收通知消息的接收端口已启动。 请注意,元素的 <Info> 值为“ListnerStarted”。

  • 适配器执行PROCESS_RECORDS过程。 Oracle 数据库的下一个响应针对该过程。

    <?xml version="1.0" encoding="utf-8" ?>
    <PROCESS_RECORDSResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG">
      <TABLE_DATA>
        <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
          <xs:element msdata:IsDataSet="true" name="NewDataSet">
            <xs:complexType>
              <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element minOccurs="0" name="TID" type="xs:decimal" />
                      <xs:element minOccurs="0" name="ACCOUNT" type="xs:decimal" />
                      <xs:element minOccurs="0" name="PROCESSED" type="xs:string" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:schema>
        <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
        <NewDataSet xmlns="">
          <NewTable>
            <TID>1</TID>
            <ACCOUNT>100001</ACCOUNT>
            <PROCESSED>n</PROCESSED>
          </NewTable>
          <NewTable>
            ......
            ......
          </NewTable>
          ......
          ......
        </NewDataSet>
        </diffgr:diffgram>
      </TABLE_DATA>
    </PROCESS_RECORDSResponse>
    

    这是 SELECT 语句作为PROCESS_RECORDS过程的一部分执行的响应。

  • PROCESS_RECORDS过程还会更新行,以将 PROCESSED 设置为“y”。 因此,适配器会收到另一个更新操作通知。

    <?xml version="1.0" encoding="utf-8" ?>
    <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/">
      <Details>
        <NotificationDetails>
          <ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName>
          <Info>32</Info>
          <QueryId>0</QueryId>
        </NotificationDetails>
      </Details>
      <Info>Update</Info>
      <ResourceNames>
        <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string>
      </ResourceNames>
      <Source>Data</Source>
      <Type>Change</Type>
    </Notification>
    

    请注意, Info 元素包含“Update”。

  • 第二个通知后,适配器将再次执行PROCESS_RECORDS过程。 但是,现在由于没有记录将 PROCESSED 列设置为“n”,因此该过程将返回类似于以下内容的空响应。

    <?xml version="1.0" encoding="utf-8" ?>
    <PROCESS_RECORDSResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG">
      <TABLE_DATA>
        <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
          <xs:element msdata:IsDataSet="true" name="NewDataSet">
            <xs:complexType>
              <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element minOccurs="0" name="TID" type="xs:decimal" />
                      <xs:element minOccurs="0" name="ACCOUNT" type="xs:decimal" />
                      <xs:element minOccurs="0" name="PROCESSED" type="xs:string" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:schema>
        <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
          <NewDataSet xmlns="" />
        </diffgr:diffgram>
      </TABLE_DATA>
    </PROCESS_RECORDSResponse>
    

最佳实践

部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,这样就无需为同一业务流程创建发送端口和接收端口。 有关绑定文件的详细信息,请参阅 重用 Oracle 数据库适配器绑定

另请参阅

使用 BizTalk Server 接收 Oracle 数据库更改通知