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的消息、队列、服务、契约等。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE master;
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的值为: //设置执行脚本

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->DECLARE @DlgHandle UNIQUEIDENTIFIER;
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的查询中输入以下脚本,将消息发往目标队列

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->DECLARE @RequestMsg XML;
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消息。

Dataset XML
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><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。

最后,再次发送消息到目标队列中。我们就可以在输出文件夹中查看到我们发送的消息:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><CBCYEMsg>Hello, World</CBCYEMsg> 

总结

SQL Service Broker作为在SQL Server实现的异步消息应用基础。BizTalk提供了比较好的支持,对于这两种技术的更多、更价值的应用,可能还需要业务人员和开发人员在不断的尝试中才能知道。

BizTalk 开发系列(四十) BizTalk WCF-SQL Adapter读取SQL Service Broker消息相关推荐

  1. BizTalk 开发系列(四十二) 为BizTalk应用程序打包不同的环境Binding

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 我们在使用微软或者其他公司提供的BizTalk应用程序MSI包的时候经常会有一个目 ...

  2. BizTalk开发系列(三十四) Xpath

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广 ...

  3. BizTalk开发系列(三十八)微软BizTalk Server定价和许可[解读]

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 做BizTalk的项目一段时间了,但是对BizTalk的价格和许可还不是很了解.给 ...

  4. BizTalk开发系列(二十二) 开发自定义Map Functoid

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作 ...

  5. BizTalk开发系列(二十九) 宏的使用

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 在BizTalk中可以使用宏集合动态的让BizTalk发送处理程序使用单独的值来替 ...

  6. BizTalk开发系列(二十三) BizTalk性能指标参考

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 BizTalk项目目前比较少,使用的客户也不多.大多只知道BizTalk是一个不错 ...

  7. BizTalk开发系列(十九) BizTalk命名规范

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根 ...

  8. BizTalk开发系列(十二) Schema设计之Group与Order

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk ...

  9. BizTalk开发系列(三十一)配置和使用HTTP适配器

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 BizTalk的主机分别进程内主机和独立主机.但由于一直使用的是进程内主机,对于独 ...

最新文章

  1. 奇迹服务器维护,奇迹MU 3月31日服务器维护更新公告
  2. php万年历上个月下个月,php 万年历
  3. html表格高度适应屏幕,Table的自适应高度
  4. 前端学习(2101):javascript高阶函数得使用
  5. dos 退出for循环_循环?一次帮你搞定!
  6. 5月16日亮相!华硕ZenFone 6新旗舰曝光:无刘海全面屏加持
  7. 安装Harbor1.4.0开源docker镜像仓库(含letsencrypt证书)
  8. 趣达学院学习有奖活动!
  9. 动机才是需求,问题只是现象
  10. 西门子1200走总线FB284控制3台V90伺服和相机调整角 度,DP通讯控制FANUC机器人
  11. java ssm酒店客房预订管理系统
  12. 首次!让我们出一个基于延迟的同行 IP 库数据评估来打个样~
  13. echarts实现组织结构图
  14. Oracle RAC原理
  15. 华为鸿蒙宣传图,VIVO 联动华为?官方宣传图出现华为智联,为鸿蒙合作埋下伏笔...
  16. 在线绘制图表工具的使用
  17. 生活:电影穿普拉达的女王(the Devil Wears Prada)的感想
  18. Sketch教程如何实现背景局部模糊
  19. android intent.action pick,android intent pick
  20. 互操作性将如何影响区块链发展的未来?

热门文章

  1. 信息学奥赛一本通(1198:逆波兰表达式)
  2. 信息学奥赛一本通(1409:判决素数个数)
  3. 信息学奥赛一本通(1019:浮点数向零舍入)
  4. 图论 —— 图的遍历
  5. Linux 使用正则表达式的常用命令
  6. 理论基础 —— 二叉树
  7. JAVA班级年龄平均值代码_java用list集合存储学生信息并算出成绩平均值操作
  8. linux ioctl及ioctl command
  9. Matlab代码提示“svmtrain已删除 请改用fitcsvm”,以及svmpredict没有返回结果label和精度accuracy的解决办法
  10. foundApp宣传展示页企业网站模板