使用 BizTalk Server 处理通知消息以完成 Oracle 数据库中的特定任务

可以使用 Oracle 数据库适配器接收有关对 Oracle 数据库表的更改的通知。 但是,适配器仅向你发送通知,指出某些记录已插入、更新或删除特定数据库表中。 对这些记录的任何后期处理必须由客户端应用程序本身处理。 本主题提供基于方案的说明,说明如何根据从 Oracle 数据库接收的通知类型处理表中的记录。

接收通知后执行后续操作的方案

下面是适配器客户端必须执行某些通知后任务的情况。

  • 方案 1. 请考虑以下情况:适配器客户端必须根据从 Oracle 数据库收到的通知类型执行某些任务。 例如,如果在表“B”中插入了记录,则客户端应用程序必须更新表“A”中的记录。 同样,如果从表“B”中删除记录,则客户端应用程序必须从表“A”中删除记录。

    在这种情况下,从收到的通知消息中,适配器客户端必须提取通知的类型,以确定通知是用于插入操作还是删除操作。 确定通知类型后,适配器客户端必须执行后续操作以插入或更新相关表。

  • 方案 2. 请考虑这样一种情况:接收表更改通知消息的接收位置出现故障。 当接收位置关闭时,某些记录将添加到表中。 但是,对于这些记录,适配器客户端不会收到任何通知。 备份接收位置时,适配器通过发送特定消息通知客户端,然后客户端应用程序必须查找在接收位置关闭时插入数据库表中的所有记录。

    在这种情况下,从收到的通知消息中,适配器客户端必须提取有关通知是针对数据库表更改还是接收位置开始的信息。 如果通知是针对接收位置开始的,则适配器客户端必须实现逻辑来处理在接收位置关闭时可能已插入、更新或删除的记录。

注意

这些只是为了更好地了解如何使用 Oracle 数据库适配器中的通知功能而列出的一些示例方案。 但是,提取收到的通知类型所需的基本任务集对于所有方案都是相似的。 本主题提供有关如何从通知消息中提取通知类型的说明。

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

在本主题中,为了演示如何处理通知消息以执行后续任务,我们考虑一种基本方案,即适配器客户端使用 BizTalk 应用程序接收对 ACCOUNTACTIVITY 表所做的更改的通知消息。 收到通知后,客户端会筛选收到的通知类型并执行后续操作。 为了演示一个非常基本的方案,让我们考虑适配器客户端根据收到的通知类型将通知消息复制到不同的文件夹。 因此:

  • 如果通知消息用于插入或更新操作,适配器客户端会将消息复制到 C:\TestLocation\UpsertNotification 文件夹。

  • 如果通知消息用于任何其他操作(例如 Delete),则适配器客户端会将消息复制到 C:\TestLocation\OtherNotificaiton 文件夹。

    若要在 BizTalk 应用程序中实现此目的,业务流程必须包含以下项:

  • 用于接收通知消息的单向接收端口。

  • 包含 xpath 查询的表达式形状,用于提取有关收到的通知消息类型的信息。

  • 在业务流程中包含决策块的“决定”形状。 在此决策块中,应用程序根据收到的通知消息决定要执行的后续操作。

  • 最终接收通知消息的两个单向发送端口。

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

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

注意

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

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

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

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

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

  1. 创建 BizTalk 项目,然后为 通知 入站操作生成架构。 (可选)可以为 InboundOperationTypeNotificationPortNotificationStatement 绑定属性指定值。

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

  3. 按照上一节中所述创建业务流程。

  4. 生成和部署 BizTalk 项目。

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

    注意

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

  6. 启动 BizTalk 应用程序。

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

生成架构

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

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

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

  3. 通知 操作生成架构。

定义消息和消息类型

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

对于本主题,必须创建一条消息才能从 Oracle 数据库接收通知。

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

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

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

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

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

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

    使用此选项 要执行此操作
    标识符 键入 NotifyReceive
    消息类型 从下拉列表中,展开“ 架构”,然后选择 “Process_Notification.OracleDBBinding.Notification”,其中 “Process_Notification ”是 BizTalk 项目的名称。 OracleDBBinding 是为 通知 操作生成的架构。

设置业务流程

必须创建 BizTalk 业务流程,以使用 BizTalk Server 从 Oracle 数据库接收通知消息,然后根据收到的通知类型执行任务。 在此业务流程中,适配器根据为 NotificationStatement 绑定属性指定的 SELECT 语句接收通知消息。 在表达式形状中指定的 xpath 查询将通知的类型提取到变量中,例如 NotificationType。 “决定”形状使用此变量中的值来确定收到的通知类型,并采用相应的“路径”来执行后续操作。 如上一部分所述,业务流程将根据收到的通知消息类型执行以下操作。

  • 如果通知消息用于插入或更新操作,适配器客户端会将消息复制到 C:\TestLocation\UpsertNotification 文件夹。

  • 如果通知消息用于任何其他操作(例如 Delete),则适配器客户端会将消息复制到 C:\TestLocation\OtherNotificaiton 文件夹。

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

  • 用于接收通知消息的单向接收端口。

  • 包含 xpath 查询的表达式形状,用于提取收到的通知类型。

  • 在业务流程中包含决策块的“决定”形状。 在此决策块中,应用程序根据收到的通知消息决定要执行的后续操作。

  • 最终接收通知消息的两个单向发送端口。

  • 接收形状。

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

    用于执行通知后任务 的业务流程

添加消息形状

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

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

- 将 “激活” 设置为 “True”

添加表达式形状

在业务流程中包含表达式形状的目的是使用 xpath 查询来提取收到的通知消息类型。 在创建 xpath 查询之前,让我们看一下通知消息的格式。 典型的通知消息类似于以下内容:

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

如你所看到的,有关通知类型的信息在 父标记内的 <info> 标记中 <Notification> 可用。 因此,作为此表达式形状的一部分,必须:

  • 创建一个变量,其中包含 标记中的值, <Info> 并将其类型设置为 System.String。 有关创建变量的详细信息,请参阅 在业务流程中使用变量

    对于本主题,请将变量命名为 NotificationType

  • 创建 xpath 查询以从 <Info> 标记中提取值。 xpath 查询将类似于以下内容:

    NotificationType = xpath(NotifyReceive,"string(/*[local-name()='Notification']/*[local-name()='Info']/text())");
    

    在此 xpath 查询中, NotifyReceive 是你为接收通知消息而创建的消息。 函数中的 string 摘录指示查询必须提取 标记中的 <Info> 值,而标记又在 标记内 <Notification> 。 最后,查询提取的值将分配给 NotificaitonType 变量。

添加“决定形状”

添加“决定”形状的目的是在业务流程中包含一个决策块,以便根据收到的通知消息类型确定要执行哪些后续操作。 根据 NotificationType 变量的值做出决策。 在本主题中,业务流程根据收到的通知消息类型做出决策。 因此,规则形状中的条件指定如下:

NotificationType.Equals("Insert") | NotificationType.Equals("Update")

此条件表明,如果 NotificaitonType 变量的值为 Insert 或 Update,则业务流程将执行一组任务。 如果 NotificationType 变量的值是任何其他值,则业务流程将执行其他一组任务。

如前几节所述,为了演示一个简单的方法,业务流程将根据通知消息类型将消息复制到不同的文件夹。 因此,在 Rule 和 Else 块中,必须添加“发送”形状以将消息发送到不同的端口。 对于本主题,将 Rule 块中的 Send 形状命名为 SendUpsertNotification ,将 Else 块中的 Send 形状命名为 SendOtherNotification

添加端口

现在必须将以下逻辑端口添加到业务流程:

  • 用于从 Oracle 数据库接收通知消息的单向接收端口。

  • 单向发送端口,用于将插入和更新操作的通知消息发送到特定文件夹。

  • 单向发送端口,用于将任何其他操作的通知消息发送到特定文件夹。

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

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

- 将 Type 设置为 OracleNotifyPortType

- 将 通信模式 设置为 单向

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

- 将 Type 设置为 NotificationUpsertPortType

- 将 通信模式 设置为 单向

- 将“通信方向”设置为“发送
OtherNotificationPort - 将 标识符 设置为 OtherNotificationPort

- 将 Type 设置为 OtherNotificationPortType

- 将 通信模式 设置为 单向

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

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

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

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

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

- 将 操作 设置为 NotificationUpsertPort.Upsert.Request
SendOtherNotification - 将 “消息 ”设置为 “选择”

- 将 操作 设置为 OtherNotificationPort.Other.Request

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

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

配置 BizTalk 应用程序

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

配置应用程序涉及:

  • 为应用程序选择主机。

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

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

      重要

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

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

    • 在硬盘上定义一个位置和相应的文件端口,BizTalk 业务流程将在其中从 Oracle 数据库删除用于插入和更新操作的通知消息。 配置此端口以将通知消息删除到文件夹 C:\TestLocation\UpsertNotification。

    • 定义硬盘上的位置和相应的文件端口,BizTalk 业务流程将从 Oracle 数据库中删除所有其他操作的通知消息。 配置此端口以将通知消息删除到文件夹 C:\TestLocation\OtherNotification。

启动应用程序

必须启动 BizTalk 应用程序,以便从 Oracle 数据库接收通知消息,并执行后续的选择和更新操作。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程

在此阶段,请确保:

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

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

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

执行操作

启动 BizTalk 业务流程后,将执行以下一组操作:

  • 由于 NotifyOnListenerStart 绑定属性设置为 True,因此你会收到以下消息:

    <?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”。 因此,此消息在 C:\TestLocation\OtherNotification 文件夹中收到。

  • 在 ACCOUNTACTIVITY 表中插入记录。 你将收到一条通知消息,如下所示:

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

    请注意,标记中的 <Info> 值为“Insert”。 因此,此消息在 C:\TestLocation\UpsertNotification 文件夹中收到。

  • 更新 ACCOUNTACTIVITY 表中的记录。 你将收到一条通知消息,如下所示:

    <?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”。 因此,此消息在 C:\TestLocation\UpsertNotification 文件夹中收到。

  • 从 ACCOUNTACTIVITY 表中删除记录。 你将收到一条通知消息,如下所示:

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

    请注意,标记中的 <Info> 值为“Delete”。 因此,此消息在 C:\TestLocation\OtherNotification 文件夹中收到。

最佳实践

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

接收通知消息后执行复杂操作

为简单起见并更好地了解,本主题中的业务流程根据通知类型将消息复制到不同的文件夹。 但是,在实际方案中,可能需要执行更复杂的操作。 可以执行本主题中提供的类似过程,并在此基础上进行构建以执行你希望的操作。 例如,如果收到 ACCOUNTACTIVITY 表上的 Insert 操作的通知消息,则可以更改业务流程以在另一个表中插入记录。 在这种情况下,可以在“决定”形状中进行适当的更改。

另请参阅

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