使用 BizTalk Server 以增量方式从 SQL 接收查询通知

重要

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

本主题演示如何将 SQL 适配器配置为从 SQL Server 数据库接收增量查询通知消息。 若要演示增量通知,请考虑表 Employee,其中包含“状态”列。 将新记录插入此表时,状态列的值设置为 0。 可以通过执行以下作将适配器配置为接收增量通知:

  • 使用 SQL 语句注册通知,该语句检索状态列为 0 的所有记录。 为此,可以指定 NotificationStatement 绑定属性的 SQL 语句。

  • 对于已接收通知消息的行,请将“状态”列更新为 1。

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

使用 SQL 适配器绑定属性配置通知

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

注释

在为 通知 生成架构时,可以选择指定这些绑定属性,即使这并非必需。 如果您这样做,适配器服务附加组件在生成元数据时生成的端口绑定文件中也会包含您为绑定属性指定的值。 稍后可以在 BizTalk Server 管理控制台中导入此绑定文件,以创建已配置绑定属性的 WCF-custom 或 WCF-SQL 接收端口。 有关使用绑定文件创建端口的详细信息,请参阅 使用端口绑定文件配置物理端口绑定以使用 SQL 适配器

Binding 属性 DESCRIPTION
InboundOperationType 指定要执行的入站操作。 若要接收通知消息,请将此项设置为 “通知”。
NotificationStatement 指定用于注册查询通知的 SQL 语句(SELECT 或 EXEC <存储过程>)。 仅当指定 SQL 语句的结果集发生更改时,适配器才会从 SQL Server 获取通知消息。
NotifyOnListenerStart 指定适配器在启动侦听器时是否向适配器客户端发送通知。

有关这些属性的更完整说明,请参阅 有关适用于 SQL Server 适配器绑定属性的 BizTalk 适配器的信息。 有关如何使用 SQL 适配器从 SQL Server 接收通知的完整说明,请阅读详细信息。

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

为了演示 SQL 适配器如何支持从 SQL Server 接收通知消息,本主题将演示如何将适配器配置为接收对 Employee 表的更改通知。 假设 Employee 表具有Employee_ID、名称和状态的列。 每当添加新员工时,“状态”列的值将设置为 0。

若要演示接收通知,请执行以下作:

  • 为 Employee 表上的 通知(入站操作)和 选择(出站操作)生成模式。

  • 创建具有以下内容的编排:

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

      SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0  
      

      注释

      必须明确指定语句中的列名称,如同此 SELECT 语句所示。 此外,必须始终指定表名以及架构名称。 例如,dbo.Employee

    • 用于更新已发送通知的行的发送端口。 为此,可将“状态”列中的值设置为 1。 可以通过向适配器发送以下消息,作为 Select 操作的一部分来执行此操作。

      <Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
        <Columns>Employee_ID,Name,Status</Columns>  
        <Query>where Status=0;UPDATE Employee SET Status=1 WHERE Status=0</Query>  
      </Select>  
      

      在此消息中,作为元素的 <Query> 一部分,指定 UPDATE 语句以更新 Status 列。 请注意,在接收通知消息后必须执行此作,以便更新已处理的行。 若要消除等待获取通知响应的开销,然后手动删除请求消息以更新行,你将生成用于更新业务流程本身中的行的请求消息。 为此,可以在编排中使用 构造消息 形状。

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

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

  1. 创建 BizTalk 项目,然后在 Employee 表上生成 通知 (入站作)和 选择 (出站作)的架构。 (可选)可以为 InboundOperationTypeNotificationStatement 绑定属性指定值。

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

  3. 在 BizTalk 项目中创建消息,以便对 SQL Server 数据库执行“选择”信息并接收响应消息。

  4. 创建一个执行以下操作的编排:

    • 从 SQL Server 接收通知消息。

    • 创建一条消息以选择并更新接收通知的行。

    • 将此消息发送到 SQL Server 以更新行并接收响应。

  5. 生成和部署 BizTalk 项目。

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

    注释

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

  7. 启动 BizTalk 应用程序。

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

基于本主题的示例

BizTalk 适配器包提供了一个名为“IncrementalNotification”的示例,这是基于本主题的。 有关详细信息,请参阅 SQL 适配器的示例

生成架构

必须为通知操作和选择操作生成 Employee 表的架构。 有关如何生成架构的详细信息,请参阅 在 Visual Studio 中使用 SQL 适配器获取 SQL Server 操作的元数据。 生成架构时执行以下任务。 如果不想在设计时指定绑定属性,请跳过第一步。

  1. 在生成架构时,指定 InboundOperationTypeNotificationStatement 绑定属性的值。 有关此绑定属性的详细信息,请参阅 有关适用于 SQL Server 适配器绑定属性的 BizTalk 适配器的信息。 有关如何指定绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性

  2. 选择合同类型为服务(入站操作)。

  3. 通知 生成模式。

  4. 选择合同类型为客户(出站操作)

  5. 生成Employee表的Select操作模式。

定义消息和消息类型

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

对于本主题,必须创建三条消息-一个用于从 SQL Server 数据库接收通知,一个用于执行 Select作,一个用于接收 Select作的响应。

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

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

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

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

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

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

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

    将标识符设置为 将消息类型设置为
    选择 SQLNotify.TableOperation_dbo_Employee.Select,其中 TableOperation_dbo_Employee 是为Select操作生成的架构
    SelectResponse SQLNotify.TableOperation_dbo_Employee.SelectResponse

设置业务流程

您需要创建一个 BizTalk 业务流程,以使用 BizTalk Server 从 SQL Server 数据库接收通知消息,然后更新收到通知的行。 在此业务流程中,适配器根据为 NotificationStatement 绑定属性指定的 SELECT 语句接收通知消息。 通知消息在 FILE 位置接收。 收到响应后,业务流程将构造一条消息,用于更新接收通知的行。 此消息的响应也在同一 FILE 位置接收。

因此,编排必须包含以下各项:

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

  • 双向发送端口,用于发送消息以更新行并接收相同消息的响应。

  • 构造 消息 形状,用于构造消息,并在业务流程中执行更新操作。

  • 文件发送端口,用于保存更新操作的响应。

  • 接收和发送形状。

    示例编排如下所示。

    用于接收 SQL Server 通知的编排

添加消息形状

请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是消息形状的名称,如上述编排中所显示。

形状 形状类型 性能
接收通知 接收 - 将 变量名 设置为 ReceiveNotification

- 将 “激活 ”设置为 True
保存通知 发送 - 将 名称 设置为 保存通知
发送选择消息 发送 - 将 名称 设置为 SendSelectMessage
接收选择响应 接收 - 将 名称 设置为 ReceiveSelectResponse
保存选择响应 发送 - 将 名称 设置为 SaveSelectResponse

添加构建信息格式

可以使用 构造消息 形状在操作中生成请求消息,以执行 Select 操作。 为此,必须在业务流程中添加一个构造消息图形和一个消息分配图形。 对于此示例,消息分配形状调用生成消息的代码,该消息将被发送到 SQL Server,用于执行 Select 操作。 “消息分配”形状还设置发送到 SQL Server 的消息的动作。

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

生成响应的代码可以是与 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\\CreateMessage";  
            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 变量指定的位置提供 XML 请求消息(用于 Employee 表的 Select 操作)。

注释

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

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

Select = SampleMessageCreator.SampleMessageCreator.XMLMessageCreator();  
Select(WCF.Action) = "TableOp/Select/dbo/Employee";  

添加端口

请确保为每个逻辑端口指定以下属性。 端口列中列出的名称是在编排中显示的端口的名称。

港口 性能
SQLNotifyPort - 将 标识符 设置为 SQLNotifyPort

- 将 类型 设置为 SQLNotifyPortType

- 将 通信模式 设置为 单向

- 将通信方向设置为接收
保存消息端口 - 将 标识符 设置为 SaveMessagePort

- 将 类型 设置为 SaveMessagePortType

- 将 通信模式 设置为 单向

- 将通信方向设置为发送

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

- 创建一个操作 Select。 此操作用于选择响应消息。
SQLOutboundPort - 将 标识符 设置为 SQLOutboundPort

- 将 类型 设置为 SQLOutboundPortType

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

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

为动作形状指定消息并连接至端口

下表列出了为操作形状指定消息及将消息链接到端口时需要设置的属性及其值。 Shape 列中列出的名称是前文提到的业务编排中显示的消息形状的名称。

形状 性能
接收通知 - 将 消息 设置为 NotifyReceive

- 将 Operation 设置为 SQLNotifyPort.Notify.Request
保存通知 - 将 消息 设置为 NotifyReceive

- 将 操作 设置为 SaveMessagePort.Notify.Request
发送选择消息 - 将 消息 设置为 选择

- 将 操作 设置为 SQLOutboundPort.Select.Request
接收选择响应 - 将 消息 设置为 SelectResponse

- 将 操作 设置为 SQLOutboundPort.Select.Response
保存选择响应 - 将 消息 设置为 SelectResponse

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

指定这些属性后,消息形状符和端口被连接,您的编排已完成。

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

配置 BizTalk 应用程序

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

配置应用程序涉及:

  • 为应用程序选择主机。

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

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

      重要

      如果在设计时指定绑定属性,则无需执行此步骤。 在这种情况下,通过导入由“Consume Adapter Service Add-in”创建的绑定文件,可以设置所需的绑定属性,来创建 WCF 自定义或 WCF-SQL 接收端口。 有关详细信息,请参阅 使用端口绑定文件配置物理端口绑定以使用 SQL 适配器

      Binding 属性 价值
      InboundOperationType 将此设置为 “通知”。
      NotificationStatement 将此设置为:

      SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0

      注意: 必须明确指定语句中的列名称,如以下 SELECT 语句所示。 此外,必须始终指定表名以及架构名称。 例如,dbo.Employee
      NotifyOnListenerStart 将此设置为 True

      有关不同绑定属性的详细信息,请参阅 有关适用于 SQL Server 适配器绑定属性的 BizTalk 适配器的信息

      注释

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

    • 定义物理 WCF-Custom 或 WCF-SQL 发送端口以将消息发送到 SQL Server 数据库。 还必须在发送端口中指定操作。

    • 定义硬盘上的位置和相应的文件端口,BizTalk 业务流程将从 SQL Server 数据库中删除消息。 这些是您从 SQL Server 接收的通知消息,以及您通过 WCF-Custom 或 WCF-SQL 发送端口进行的选择和更新操作的消息。

启动应用程序

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

在此阶段,请确保:

  • WCF-Custom 或 WCF-SQL 单向接收端口用于接收来自 SQL Server 数据库的通知消息,该端口正在运行。

  • WCF-Custom 或 WCF-SQL 发送端口正在运行,以对 Employee 表执行选择和更新操作。

  • 从 SQL Server 接收消息的 FILE 发送端口正在运行。

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

执行操作

若要执行此操作,必须将一条记录插入 Employee 表中。 让我们假设你插入具有以下详细信息的记录:

Name = John Smith  
Designation = Manager  
Salary = 100000  

此外,请确保在 C:\TestLocation\MessageIn 上提供了执行 Select 和 Update作的 XML 消息。 XML 文件应如下所示:

<Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
  <Columns>Employee_ID,Name,Status</Columns>  
  <Query>where Status=0;UPDATE Employee SET Status=1 WHERE Status=0</Query>  
</Select>  

插入记录后,将按相同的顺序执行以下一组作:

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

    <?xml version="1.0" encoding="utf-8" ?>   
    <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">  
      <Info>Insert</Info>   
      <Source>Data</Source>   
      <Type>Change</Type>   
    </Notification>  
    

    此消息通知记录已插入 Employee 表中。 请注意,元素的值 <Info> 为“Insert”。

  • 适配器执行选择操作。 由于Select操作的XML还包括Update语句,因此将执行Update语句。 SQL Server 的下一个响应适用于 Select 语句。

    <?xml version="1.0" encoding="utf-8" ?>   
    <SelectResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
      <SelectResult>  
        <Employee xmlns="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">  
          <Employee_ID>10006</Employee_ID>   
          <Name>John</Name>   
          <Status>0</Status>  
        </Employee>  
      </SelectResult>  
    </SelectResponse>  
    

    此响应显示记录已插入到 Employee 表中,该记录的状态为 0。

  • 作为 Select 语句的一部分,还会执行 Update 语句,并将新记录的状态列更改为 1。 这再次触发来自 SQL Server 的另一条通知,适配器会收到相应的通知消息,如下所示:

    <?xml version="1.0" encoding="utf-8" ?>   
    <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">  
      <Info>Update</Info>   
      <Source>Data</Source>   
      <Type>Change</Type>   
    </Notification>  
    

    此消息通知员工表中的记录已更新。 请注意,元素的值 <Info> 为“Update”。

  • 第二个通知后,适配器将执行 Select 语句。 但是,由于现在没有状态为 0 的记录,适配器会获取一个空响应,该响应如下所示。

    <?xml version="1.0" encoding="utf-8" ?>   
    <SelectResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
      <SelectResult />   
    </SelectResponse>  
    

最佳做法

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

另请参阅

使用 BizTalk Server 接收 SQL 查询通知