SQL Service Broker 是在SQL Server 2005中新增的功能。Service Broker 为 SQL Server 提供队列和可靠的消息传递,可以可用来建立以异步消息为基础的应用。当然从题目大家可能也看出来了。我们本文主要不是为了讲SQL Service Broker(SSB),而是讲一下如何使用BizTalk WCF-SQL Adapter来访问SSB的数据。
SQL Service Broker(SSB)
为要便于大家更好的接下来的示例,我们还是概况的讲一下SSB的相关知识。更详细的背景信息大家可以在Service Broker开发人员信息中心中了解到。
SQL Service Broker实现的功能有点类似于咱们已经很熟悉的MSMQ,但它是在数据库实现消息队列这样的功能。Service Broker 可以帮助开发人员生成可伸缩的、安全的数据库应用程序。此项技术是数据库引擎的一部分,它提供一个基于消息的通信平台,使独立的应用程序组件可以作为一个整体来运行。Service Broker 包含用于异步编程的基础结构,可用于单个数据库或单个实例中的应用程序,也可用于分布式应用程序。
Service Broker 提供了生成分布式应用程序所需的大部分基础结构,从而减少了应用程序的开发时间。利用 Service Broker 还可以轻松缩放应用程序,以容纳应用程序接收的通信流量。
WCF-SQL Adapter
WCF-SQL Adapter是BizTalk Server 2009中新增的用于替换之前使用的SQL Adapter。WCF-SQL中新增了对于SQL Server新的数据类型、事件通知等的运行。以下是WCF-SQL中相对于之前SQL Adapter的功能比较:
功能 |
SQL Adapter |
WCF SQL Adapter |
在表和视图上执行创建、读取、更新和删除语句 ;执行存储过程和生成T-SQL语句 Execute create-read-update-delete statements on tables and views; execute stored procedures and generic T-SQL statements |
部分支持(发送部分仅支持存储过程和updategrams |
Yes |
通过FOR XML实现数据轮询 Database polling via FOR XML |
Yes |
Yes |
通过表格实现数据轮询(不添加 FOR XML) Database polling via traditional tabular results |
No |
Yes |
通过SQL查询通知实现数据库推送 Proactive database push via SQL Query Notification |
No |
Yes |
通过扩展适配器配置去更改连接机制和行为 Expansive adapter configuration which impacts connection management and transaction behavior |
No |
Yes |
支持多个事务,即允许将多个表和存储过程的操作放到一个原子事务中。 Support for composite transactions which allow aggregation of operations across tables or procedures into a single atomic transaction |
No |
Yes |
丰富的数据浏览和检索找到并选择数据库操作 Rich metadata browsing and retrieval for finding and selecting database operations |
No |
Yes |
支持最新的数据类型如XML和SQL Server 2008平台 Support for the latest data types (e.g. XML) and SQL Server 2008 platform |
No |
Yes |
可以被BizTalk 应用程序之外的WCF或HTTP客户端重用。 Reusable outside of BizTalk applications by WCF or basic HTTP clients |
No |
Yes |
通过WCF特有的组件和自定义WCF行为扩展适配器和配置 Adapter extension and configuration through out of the box WCF components or custom WCF behaviors |
No |
Yes |
动态生成WSDL,实时反映当前系统状态替代固定的契约需要明确的更新。 Dynamic WSDL generation which always reflects current state of the system instead of fixed contract which always requires explicit updates |
No |
Yes |
BizTalk WCF-SQL Adapter读取SQL Service Broker消息
OK, 上面讲的都是微软自家的东西。当然自家的东西兼容性要好一点。那么本节的标题其实我是故意加了一个“BizTalk”的,因为微软自从看到Adapter的价值之后就开始将Adapter Pack拆分出来卖。也就是说你也可以不购买BizTalk而是单独购买Adapter Pack通过自已开发的应用程序来访问SAP、Oracle、SQL Server等业务系统。
转到正题,以下我们将来具体讲一下演示的步骤,为了简化BizTalk程序我们将不使用Orchestration。
1.创建SSB应用
在以下操作中我们将创建数据库,创建Service Broker的消息、队列、服务、契约等。
GO
CREATE DATABASE CBCYE_SSB
ALTER DATABASE CBCYE_SSB
SET ENABLE_BROKER;
GO
USE CBCYE_SSB;
GO
CREATE MESSAGE TYPE
[//CBCYE_SSBSample/RequestMessage]
VALIDATION = WELL_FORMED_XML;
CREATE CONTRACT [//CBCYE_SSBSample/SampleContract]
([//CBCYE_SSBSample/RequestMessage]
SENT BY INITIATOR
);
CREATE QUEUE InitiatorQueue1DB;
CREATE SERVICE
[//CBCYE_SSBSample/InitiatorService]
ON QUEUE InitiatorQueue1DB;
CREATE QUEUE TargetQueue1DB;
CREATE SERVICE
[//CBCYE_SSBSample/TargetService]
ON QUEUE TargetQueue1DB
([//CBCYE_SSBSample/SampleContract]);
2.BizTalk接收端口和位置
新建一个BizTalk应用程序的端口和位置。在端口类型中选择WCF-SQL,如果未针对WCF-SQL创建独立的适配器可以选择WCF-Customer,接收管道全部选择PassThruReceive。然后在Binding中选择sqlbinding。在端口地址中输入:mssql://localhost//CBCYE_SSB
打开Binding配置页,Inbound轮询的配置项中:
如上图所示,设置PooledDataAvailableStatement的值为:SELECT COUNT(*) FROM TargetQueue1DB WITH (NOLOCK) //设置晌应条件
设置PoolingIntervallnSeconds的值为:2 //设置轮询间隔时间
设置PollingStatement的值为: //设置执行脚本
DECLARE @RecvMsg XML;
RECEIVE TOP (1)
@DlgHandle=conversation_handle,
@RecvMsg = CAST(message_body as XML)
FROM TargetQueue1DB;
IF NOT (@DlgHandle IS NULL)
BEGIN
END CONVERSATION @DlgHandle;
SELECT @RecvMsg AS ReceivedMessage;
END
设置完之后,需要创建一个发送端口用于订阅来自接收端口的消息。并将消息的内容以文件的形式发往文件夹。
3.发送消息到目标队列
在SQL Management Studio的查询中输入以下脚本,将消息发往目标队列
SELECT @RequestMsg = N'<CBCYEMsg>Hello, World</CBCYEMsg>';
DECLARE @DlgHandle UNIQUEIDENTIFIER;
BEGIN DIALOG @DlgHandle
FROM SERVICE
[//CBCYE_SSBSample/InitiatorService]
TO SERVICE
N'//CBCYE_SSBSample/TargetService'
ON CONTRACT
[//CBCYE_SSBSample/SampleContract]
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @DlgHandle
MESSAGE TYPE
[//CBCYE_SSBSample/RequestMessage]
(@RequestMsg);
4.修改配置以接收到实际发送的消息
打开目标文件夹,你可能会发现接收到的消息并不是之前发送的消息内容,而是一个完整的DataSet的XML消息。
<Polling xmlns="http://schemas.microsoft.com/Sql/2008/05/Polling/%22><PolledData><DataSet xmlns="http://schemas.datacontract.org/2004/07/System.Data%22><xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema%22 xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element msdata:IsDataSet="true" name="NewDataSet"><xs:complexType><xs:sequence><xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable"><xs:complexType><xs:sequence><xs:element minOccurs="0" name="ReceivedMessage" type="xs:string"/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><NewTable><ReceivedMessage><![CDATA[<CBCYEMsg>Hello, World</CBCYEMsg>]]></ReceivedMessage></NewTable></NewDataSet></diffgr:diffgram></DataSet></PolledData></Polling>
那么我们需要告诉WCF-SQL适配器,消息内容的路径。打开WCF-SQL的配置,
在Messaging项中选择path,在表达式中输入:/*[local-name()='Polling']/*[local-name()='PolledData']/*[local-name()='DataSet']/*[local-name()='diffgram']/*[local-name()='NewDataSet']/*[local-name()='NewTable']/*[local-name()='ReceivedMessage']
在编码中选择String。
最后,再次发送消息到目标队列中。我们就可以在输出文件夹中查看到我们发送的消息:
总结
SQL Service Broker作为在SQL Server实现的异步消息应用基础。BizTalk提供了比较好的支持,对于这两种技术的更多、更价值的应用,可能还需要业务人员和开发人员在不断的尝试中才能知道。