SQL Server 查询通知与 BizTalk Server 2009 WCF SQL 适配器





0/5 (0投票)
SQL Server 查询通知与 BizTalk Server 2009 WCF SQL 适配器
引言
SQL Server 2005 引入了查询通知功能,该功能允许应用程序订阅数据库,并根据应用程序订阅的查询结果集的变化从数据库接收通知。这可以改变应用程序的行为和性能,因为应用程序不必查询数据库即可获取更改。例如,如果一个服务/应用程序缓存了数据,它可以在缓存数据结果发生变化时刷新其缓存。这样,就可以高效且实时地刷新数据。
关于 BizTalk,以前我们只使用轮询(使用 SQL Server 适配器)来从数据库获取结果。轮询是一项繁重的操作,取决于轮询间隔和返回的结果,这将影响 BizTalk 服务器的整体性能。但现在,通过利用 SQL Server 2005/2008 的查询通知功能,BizTalk 服务器可以在查询结果集发生更改时收到通知。要进一步阅读,您可以阅读 MSDN 上的 使用查询通知。在计划使用 WCF 适配器通过 SQL 查询通知之前,请先阅读 MSDN 上的 使用适配器接收查询通知的注意事项。
从“消耗适配器服务”向导生成架构
要在 BizTalk 中使用查询通知,第一步是使用 **消耗适配器服务** 向导生成架构。您可以通过右键单击项目 -> 添加生成项 -> 消耗适配器服务来启动向导。要使用 SQL WCF 服务,您必须从向导中选择 sqlBinding 并提供 SQL URI。请参考 MSDN 上的 SQL Server 连接 URI。单击配置按钮并配置 mssql URI。
- 在“安全性”选项卡中,选择凭据类型(Windows/用户名),如果使用 SQL 身份验证,则提供用户名/密码。
- 在 URI 选项卡中,提供 URI 属性。在 InitialCatalog属性中提供数据库名称,在Server属性中提供 SQL Server 实例名称和 SQL 服务器名称/IP。入站 ID 用于类型化轮询,它使 URI 唯一。
- 在 Binding属性中,转到Inbound属性组,并将InboundOperationType属性设置为Notification。有关完整的绑定属性,请参阅 MSDN 上的 使用 BizTalk SQL Server 适配器绑定属性。 
- 由于您正在使用轮询并将入站操作类型设置为 Notification,因此您将设置 Notification 属性,其中指定了 Notification Statement。Notification Statement 是适配器接收通知的查询。每当查询返回的结果集发生更改时,就会发送 SQL 通知。有关创建查询通知的完整参考,请参阅 MSDN 上的 创建通知查询。在我的例子中,查询是“**Select [columns] from MAR_SP_INFO_V2**”。 
 最后,将生成两个文件。一个是下面所示的带有三个字段的简单架构,另一个是绑定文件 XML。  
为查询通知和处理结果设置编排
当编排收到通知时,编排必须确定通知的类型,因为 WCF 适配器将返回两种类型的通知:
- 基于结果集变化的通知
- 接收位置在失败后启用时的通知
当 NotifyOnListenerStart 在绑定属性中设置为 true 时,适配器将在接收位置再次备份时发送通知。但请注意,当接收位置处于关闭状态且数据库发生变化时,适配器不会执行任何操作。适配器将在接收位置再次启动后开始通知。例如,当接收位置关闭并且插入和更新了几个记录时,当它再次启动时,它不会通知发生了什么。编排必须有一个检测变化的实现。为此,您可以阅读 MSDN 上的 接收接收位置中断后的查询通知。
从向导生成的架构将有三个字段:Info、Source 和 Type。在编排中,第一步是使用一个决定形状来决定编排收到了哪种类型的通知。我决定区分所有这三个字段,以便在我的编排中使用它们。如果您不这样做,可以使用 XPath 来提取字段的值。
在决定形状中,首先检查 Info 字段和 Source。如果 Info 是“ListenerStarted”,Source 是“SqlBinding”,Type 是“Startup”,您可以继续执行检测接收位置关闭期间数据库变化的逻辑。如果 Info 是“Insert/Update 或 Delete”操作,Source 将是“Data”,Type 将是“Change”。
| 字段 | 数据库中的数据更改时 | 侦听器启动时(接收位置已启用) | 
| Info(信息) | 插入/更新或删除 | ListenerStarted | 
| 来源 | Data | SqlBinding | 
| 类型 | 更改 | 启动 | 
在我的编排中,对于接收侦听器启动通知或更新和删除,我什么也不做,我只对表中 insert 操作采取行动感兴趣。因此,我在决定形状中对此进行检查。我将设计某种机制来检查我的接收位置是否在关闭后重新启动,我该怎么办。

现在,我需要获取插入的新记录并进行处理。我正在使用 WCF SQL 适配器,并选择 StatusRecord 字段设置为 NEW 的所有记录。NEW 是新插入记录的默认值,以便我识别记录。我将在我的下一篇文章中详细介绍我如何使用 WCF SQL 适配器选择记录。当我选择记录并完成处理后,我会将 StatusRecord 列更新为 READ。

我将整个 select 消息响应传递给我的助手类,在那里完成所有处理,如果操作成功,我将记录结果。
配置 WCF 自定义适配器属性以进行通知
这里有两种配置适配器属性的方法,第一种是您可以在此处重新定义属性,或者您可以直接从 WCF 适配器服务向导生成的绑定文件中导入属性。为此,您可以参考 MSDN 上的 使用端口绑定文件配置物理端口绑定。我还没有研究过,但会在需要时使用。
我将为 WCF 自定义适配器进行手动绑定。完成编排后,您必须构建并部署 BizTalk 应用程序。然后从 BizTalk 管理控制台打开接收端口节点并创建一个新的接收端口。然后创建一个新的接收位置。将类型选择为 WCF-Custom,并使用默认的 XML 接收管道。单击配置按钮来配置适配器属性。
在“常规”选项卡中,指定地址 URI。您可以将其从“消耗适配器服务”向导生成的绑定文件中复制粘贴。
 
 
在“其他”选项卡中,指定数据库的用户名和密码。否则,您将收到用户凭据错误。
 
 
现在对于绑定属性,转到“绑定”选项卡,选择 sqlBinding 作为绑定类型。您将在下面看到所有绑定属性。我们只对通知绑定属性感兴趣。将 inboundOperationType 设置为 Notification,将 notificationStatement 属性设置为 SQL 查询。基于此查询结果集,将向编排发送通知。并将 notifyOnListenerStart 属性设置为 True,如果您希望在接收位置启用时收到通知。在我的例子中,它是 false。
 
 
历史
- 2010 年 4 月 13 日:初稿

