你是否曾经在eBay上购买过东西或者通过在线贸易程序监视过库存?电子邮件通知让你能够极其方便地了解价格的变化、体育比赛的分数、拍卖竞标,这样的特性在任何大量使用的系统里通常都是可以要求添加的功能。但是提供通知这项功能意味着要编写大量的内部代码,而且在原有应用程序上加入通知功能几乎需要重写代码。
微软最近发布了一个工具包,你可以用它来给应用程序添加通知的功能,而只会造成相对少的影响。SQL服务器通知服务是一个为用户提供特定事件通知的通用框架,它构建在SQL服务器2000和.NET Framework上。通知服务框架就目前的使用而言是足够完备的,但是它的扩展性和自定义能力也是很强的。让我们来看看通知服务框架的结构,然后再看看你该如何在应用程序里使用它。
通知服务构架
通知服务涉及三个主要的概念:事件、订阅和通知,而且它使用几个不同的组件来管理通知用户的进程。整件事都是由一套NT服务控制的,服务器上运行的每个通知服务实例都有一套服务。
事件一般代表所发生的任何真实或者虚拟事情。事件可以在多种情况下被触发:在某种商品的数量下降到特定水平的时候,订购的商品运送到消费者的时候,或者甚至是某个文件或者其他共享的资源被修改的时候。你也可以创建不依赖特定条件的日常定期事件。用于事件的数据――它们采取COM对象的形式,包括.NET类、XML文档或者SQL服务器的存储过程――由事件提供程序生成。通知服务有两种内置的事件提供程序:
文件系统守护程序监视着指定的系统目录,同时还监视着新的XML文件。在发现有新文件的时候,它依据文件所包含的数据生成一个事件。你可以使用文件系统守护程序从外部访问到事件。
SQL服务器的事件提供程序使用一个专用的SQL查询来监视特定表格数据的变化,并根据查询的结果生成事件。显然,这个提供程序对于根据应用程序的数据生成事件是很有用的。
订阅是定义用户感兴趣事件类型的规则。订阅管理对象API提供了一个管理订阅的通用接口。叫做生成器的通知服务组件会周期地运行,对事件和定阅者进行匹配。
通知是关于专用事件的通过任何方法送到订阅者的信息。通知服务包括通过电子邮件、HTTP和修改磁盘文件对通知的支持。你也可以提供自己的通知方法,例如即时信息。有一个分配器组件,它能够使用XSLT或者你所提供的任何自定义方法把来自事件的数据格式化成通知。
SQL服务器显著的变化
就像你能从这个框架的全名所能预计到的一样,SQL服务器在通知服务工具上扮演了一个突出的角色。来自事件的输入数据被保存在数据的一组表格里。通过对这些表格运行一组带有参数的存储进程,生成器会检查相关的订阅。分配器会提取事件数据来满足任何相关的、由生成器找到的订阅。
让SQL服务器完成这项工作的核心内容是相当有利的,因为通知服务会和SQL服务器自身一起伸缩。而且,通过使用SQL服务器事件提供程序,你可以把通知这项功能加入到已有的应用程序里,而不需要触及(如果需要的话)这个应用程序的代码:连接在于数据库本身。
创建通知服务应用程序
使用内置的组件,创建通知服务应用程序的过程就相当简单明了了。你会需要某种前端,来让用户管理他们的订阅:这个前端最有可能是Web应用程序。它使用既是.NET类和COM接口的订阅管理API来为各种事件的通知注册用户。
你还需要创建一些XML配置文件来定义这项服务。在配置文件里,你要指定服务的名称、宿主SQL服务器的名称、服务要使用的通知渠道,以及应用程序的一些基本信息。应用程序的定义文件,或者叫ADF,会配置SQL服务器的表格和用来支持服务的过程,还会控制各种性能设置:例如多久一次运行生成器和分配器;每次运行他们的时候要处理多少内容;记录的规则;如果落后于事件检查或者通知,服务将如何反应;以及需要多久才删除陈旧的事件和通知。
就是这样的,你要做的所有内容就是使用NSControl Create和NSControl Register命令创建和注册你的新服务。如果想要使用自定义的事件提供程序或者通知渠道,那么要做的当然会更多;但是使用内置的组件,你就很可能需要花费比创建实际服务更多的时间来创建订阅管理应用程序。
MSDN上有更多的信息
SQL服务器通知服务并没有做任何新的东西;开发人员编写通知应用程序已经有很多年了。但是它的确让创建这些应用程序变得相当的容易了,而且它使用的技术已经为大多数使用微软开发工具的开发人员非常熟悉了。如果你还想学习更多的东西,微软的MSDN Web网站有一整块都是都是通知服务入门资源的,包括一个实例,用于向你演示如何创建一个简单的股市行情通知服务。