使用 BizTalk Server 处理通知消息以在 SQL 中完成特定任务
可以使用 SQL 适配器接收SQL Server数据库表更改的通知。 但是,适配器仅向你发送通知,指出某些记录已插入、更新或删除了某个数据库表中。 对这些记录进行的任何后处理必须由客户端应用程序自己处理。 本主题提供基于方案的说明,说明如何根据从 SQL Server 数据库收到的通知类型处理表中的记录。
接收通知后执行后续操作的方案
下面是适配器客户端必须执行某些通知后任务的情况。
场景 1。 假设适配器客户端必须根据从 SQL Server 收到的通知类型执行某些任务。 例如,如果在表“B”中插入记录,客户端应用程序必须更新表“A”中的记录。 同样,如果从表“B”中删除记录,客户端应用程序必须删除表“A”中的记录。
在这种情况下,从收到的通知消息中,适配器客户端必须提取通知类型,以确定通知是用于插入操作还是删除操作。 确定通知类型后,适配器客户端必须执行后续操作来插入或更新相关表。
场景 2。 假设接收表更改通知消息的接收位置出现故障。 当接收位置关闭时,会将一些记录添加到表中。 但是,对于这些记录,适配器客户端不会收到任何通知。 备份接收位置时,适配器通过发送特定消息来通知客户端,然后客户端应用程序必须查找在接收位置关闭时在数据库表中插入的所有记录。
在这种情况下,从收到的通知消息中,适配器客户端必须提取有关通知是针对数据库表更改还是接收位置开始的信息。 如果通知针对接收位置开始,则适配器客户端必须实现逻辑来处理在接收位置关闭时可能已插入、更新或删除的记录。
注意
这些只是列出的一些示例方案,以便更好地了解如何使用 SQL 适配器中的通知功能。 但是,提取接收的通知类型所需的基本任务集对于所有方案都是相似的。 本主题提供有关如何从通知消息中提取通知类型的说明。
本主题如何演示接收通知消息和提取通知类型
在本主题中,为了演示如何处理通知消息以执行后续任务,我们考虑了一个基本方案,其中适配器客户端使用 BizTalk 应用程序接收针对 Employee 表的更改的通知消息。 收到通知后,客户端会筛选收到的通知类型并执行后续操作。 为了演示一个非常基本的方案,请考虑适配器客户端根据收到的通知类型将通知消息复制到不同的文件夹。 因此:
如果通知消息用于插入或更新操作,适配器客户端会将消息复制到 C:\TestLocation\UpsertNotification 文件夹。
如果通知消息用于任何其他操作(例如 Delete),则适配器客户端会将消息复制到 C:\TestLocation\OtherNotificaiton 文件夹。
若要在 BizTalk 应用程序中实现此目的,业务流程必须包含以下项:
用于接收通知消息的单向接收端口。
包含 xpath 查询的表达式形状,用于提取有关收到的通知消息类型的信息。
在业务流程中包含决策块的“决定”形状。 在此决策块中,应用程序根据收到的通知消息决定要执行的后续操作。
两个最终接收通知消息的单向发送端口。
使用 SQL 适配器绑定属性配置通知
下表汇总了用于配置从 SQL Server 接收通知的 SQL 适配器绑定属性。 在 BizTalk Server 管理控制台中配置接收端口时,必须指定这些绑定属性。
注意
在生成 通知 操作的架构时,可以选择指定这些绑定属性,即使这不是必需的。 如果这样做,则使用适配器服务外接程序在元数据生成过程中生成的端口绑定文件也会包含为绑定属性指定的值。 稍后可以在 BizTalk Server 管理控制台中导入此绑定文件,以使用已设置的绑定属性创建 WCF-custom 或 WCF-SQL 接收端口。 有关使用绑定文件创建端口的详细信息,请参阅 使用端口绑定文件配置物理端口绑定以使用 SQL 适配器。
Binding 属性 | 说明 |
---|---|
InboundOperationType | 指定要执行的入站操作。 若要接收通知消息,请将此项设置为 “通知”。 |
NotificationStatement | 指定用于注册查询通知的 SQL 语句 (SELECT 或 EXEC <存储过程>) 。 仅当指定 SQL 语句的结果集发生更改时,适配器才会从SQL Server获取通知消息。 |
NotifyOnListenerStart | 指定在启动侦听器时适配器是否向适配器客户端发送通知。 |
有关这些属性的更完整说明,请参阅阅读适用于 SQL Server 适配器绑定属性的 BizTalk 适配器。 有关如何使用 SQL 适配器接收来自SQL Server通知的完整说明,请进一步阅读。
如何从SQL Server数据库接收通知消息
使用带BizTalk Server的 SQL 适配器对 SQL Server 数据库执行操作涉及构建基块以使用 SQL 适配器开发 BizTalk 应用程序中所述的过程性任务。 若要将适配器配置为接收通知消息,这些任务包括:
创建 BizTalk 项目,然后生成 通知 入站操作的架构。 (可选)可以为 InboundOperationType 和 NotificationStatement 绑定属性指定值。
在 BizTalk 项目中创建一条消息,用于从 SQL Server 数据库接收通知。
按照上一部分所述创建业务流程。
生成并部署 BizTalk 项目。
通过创建物理发送和接收端口配置 BizTalk 应用程序。
注意
对于接收通知消息等入站操作,必须仅配置单向 WCF-Custom 或 WCF-SQL 接收端口。 入站操作不支持双向 WCF-Custom 或 WCF-SQL 接收端口。
启动 BizTalk 应用程序。
本主题提供有关执行这些任务的说明。
生成架构
必须为 通知 入站操作生成架构。 有关如何生成架构的详细信息,请参阅使用 SQL 适配器在 Visual Studio 中检索SQL Server操作的元数据。 生成架构时执行以下任务。 如果不想在设计时指定绑定属性,请跳过第一步。
在生成架构时指定 InboundOperationType 和 NotificationStatement 绑定属性的值。 有关此绑定属性的详细信息,请参阅阅读有关 bizTalk Adapter for SQL Server 适配器绑定属性。 有关如何指定绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性。
选择协定类型作为 服务 (入站操作) 。
为 通知 操作生成架构。
定义消息和消息类型
前面生成的架构描述了业务流程中的消息所需的“类型”。 消息通常是一个变量,其类型由相应的架构定义。 生成架构后,必须将其链接到 BizTalk 项目的业务流程视图中的消息。
对于本主题,必须创建一条消息才能从 SQL Server 数据库接收通知。
执行以下步骤来创建消息并将其链接到架构。
创建消息并链接到架构
将业务流程添加到 BizTalk 项目。 在解决方案资源管理器,右键单击 BizTalk 项目名称,指向“添加”,然后单击“新建项”。 键入 BizTalk 业务流程的名称,然后单击“ 添加”。
打开 BizTalk 项目的业务流程视图窗口(如果尚未打开)。 单击“ 视图”,指向 “其他窗口”,然后单击“ 业务流程视图”。
在 “业务流程视图”中,右键单击“ 消息”,然后单击“ 新建消息”。
右键单击新创建的消息,然后选择“ 属性窗口”。
在Message_1的“属性”窗格中,执行以下操作:
使用此选项 要执行此操作 标识符 键入 NotifyReceive
。消息类型 在下拉列表中,展开“ 架构”,然后选择“ Process_Notification.Notification”,其中 “Process_Notification ”是 BizTalk 项目的名称。 通知 是为 通知 操作生成的架构。
设置业务流程
必须创建 BizTalk 业务流程才能使用 BizTalk Server 从 SQL Server 数据库接收通知消息,然后根据收到的通知类型执行任务。 在此业务流程中,适配器根据为 NotificationStatement 绑定属性指定的 SELECT 语句接收通知消息。 在表达式形状中指定的 xpath 查询将通知的类型提取到变量中,例如 NotificationType。 “决定”形状使用此变量中的值来确定收到的通知类型,并采用相应的“路径”来执行后续操作。 如上一部分所述,业务流程将根据收到的通知消息类型执行以下操作。
如果通知消息用于插入或更新操作,适配器客户端会将消息复制到 C:\TestLocation\UpsertNotification 文件夹。
如果通知消息用于任何其他操作(例如 Delete),则适配器客户端会将消息复制到 C:\TestLocation\OtherNotificaiton 文件夹。
因此,业务流程必须包含以下项:
用于接收通知消息的单向接收端口。
包含 xpath 查询的表达式形状,用于提取收到的通知类型。
在业务流程中包含决策块的“决定”形状。 在此决策块中,应用程序根据收到的通知消息决定要执行的后续操作。
最终接收通知消息的两个单向发送端口。
接收形状。
示例业务流程类似于以下内容。
添加消息形状
请确保为每个消息形状指定以下属性。 “形状”列中列出的名称是刚才提到的业务流程中显示的消息形状的名称。
形状 | 形状类型 | 属性 |
---|---|---|
ReceiveNotification | 接收 | - 将 Name 设置为 ReceiveNotification - 将 “激活” 设置为 “True” |
添加表达式形状
在业务流程中包含表达式形状的目的是使用 xpath 查询来提取收到的通知消息类型。 在创建 xpath 查询之前,让我们看一下通知消息的格式。 典型的通知消息类似于以下内容:
<Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">
<Info>Insert</Info>
<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。
添加端口
现在必须将以下逻辑端口添加到业务流程:
用于从SQL Server接收通知消息的单向接收端口。
单向发送端口,用于将插入和更新操作的通知消息发送到特定文件夹。
单向发送端口,用于将任何其他操作的通知消息发送到特定文件夹。
请确保为每个逻辑端口指定以下属性。 “端口”列中列出的名称是业务流程中显示的端口名称。
端口 | 属性 |
---|---|
SQLNotifyPort | - 将 标识符 设置为 SQLNotifyPort - 将 Type 设置为 SQLNotifyPortType - 将 通信模式 设置为 单向 - 将 通信方向 设置为 接收 |
NotificationUpsertPort | - 将 标识符 设置为 NotificationUpsertPort - 将 Type 设置为 NotificationUpsertPortType - 将 通信模式 设置为 单向 - 将“通信方向”设置为“发送” |
OtherNotificationPort | - 将 标识符 设置为 OtherNotificationPort - 将 Type 设置为 OtherNotificationPortType - 将 通信模式 设置为 单向 - 将“通信方向”设置为“发送” |
指定操作形状的消息并连接到端口
下表指定应设置的属性及其值,以便为操作形状指定消息并将消息链接到端口。 Shape 列中列出的名称是前面提到的业务流程中显示的消息形状的名称。
形状 | 属性 |
---|---|
ReceiveNotification | - 将 Message 设置为 NotifyReceive - 将 操作 设置为 SQLNotifyPort.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-SQL 单向接收端口。 此端口侦听来自 SQL Server 数据库的通知。 有关如何创建端口的信息,请参阅 手动配置到 SQL 适配器的物理端口绑定。 请确保为接收端口指定以下绑定属性。
重要
如果在设计时指定了绑定属性,则不需要执行此步骤。 在这种情况下,可以通过导入由使用适配器服务外接程序创建的绑定文件,创建 WCF-custom 或 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 配置事务隔离级别和事务超时。
在硬盘上定义一个位置和相应的文件端口,BizTalk 业务流程将从SQL Server数据库中删除通知消息,以便执行插入和更新操作。 将此端口配置为将通知邮件删除到文件夹 C:\TestLocation\UpsertNotification。
在硬盘上定义一个位置和相应的文件端口,BizTalk 业务流程将从SQL Server数据库中删除通知消息,以便执行所有其他操作。 配置此端口以将通知邮件删除到文件夹 C:\TestLocation\OtherNotification。
启动应用程序
必须启动 BizTalk 应用程序,以便从SQL Server数据库接收通知消息,并执行后续的选择和更新操作。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程。
在此阶段,请确保:
WCF-Custom 或 WCF-SQL 单向接收端口,用于从正在运行SQL Server数据库接收通知消息。
从SQL Server接收消息的两个 FILE 发送端口正在运行。
操作的 BizTalk 业务流程正在运行。
执行操作
启动 BizTalk 业务流程后,将发生以下一组操作:
由于 NotifyOnListenerStart 绑定属性设置为 True,因此会收到以下消息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/"> <Info>ListenerStarted</Info> <Source>SqlBinding</Source> <Type>Startup</Type> </Notification>
请注意,标记中的
<Info>
值为“ListnerStarted”。 因此,此消息在 C:\TestLocation\OtherNotification 文件夹中收到。在 Employee 表中插入记录。 你将收到一条通知消息,如下所示:
<?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>
请注意,标记中的
<Info>
值为“Insert”。 因此,此消息在 C:\TestLocation\UpsertNotification 文件夹中收到。更新 Employee 表中的记录。 你将收到一条通知消息,如下所示:
<?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”。 因此,此消息在 C:\TestLocation\UpsertNotification 文件夹中收到。从 Employee 表中删除记录。 你将收到一条通知消息,如下所示:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/"> <Info>Delete</Info> <Source>Data</Source> <Type>Change</Type> </Notification>
请注意,标记中的
<Info>
值为“Delete”。 因此,此消息在 C:\TestLocation\OtherNotification 文件夹中收到。
最佳实践
部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,这样就无需为同一业务流程创建发送端口和接收端口。 有关绑定文件的详细信息,请参阅 重用适配器绑定。
在收到通知消息后执行复杂操作
为简单起见和更好地了解,本主题中的业务流程根据通知类型将消息复制到不同的文件夹。 但是,在实际方案中,可能需要执行更复杂的操作。 可以执行本主题中提供的类似过程,并基于这些过程进行构建以执行你希望的操作。 例如,如果收到针对 Employee 表的 Insert 操作的通知消息,则可以更改业务流程以在另一个表中插入记录。 在这种情况下,可以在“决定”形状中进行适当的更改。
教程 2:使用 SQL 适配器的员工 - 采购订单流程中详细介绍了其中一种方案。