BizTalk 开发系列(四十) BizTalk WCF-SQL Adapter读取SQL Service Broker消息
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的消息、队列、服务、契约等。
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的值为: //设置执行脚本
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的查询中输入以下脚本,将消息发往目标队列
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
那么我们需要告诉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。
最后,再次发送消息到目标队列中。我们就可以在输出文件夹中查看到我们发送的消息:
<CBCYEMsg>Hello, World</CBCYEMsg>
总结
SQL Service Broker作为在SQL Server实现的异步消息应用基础。BizTalk提供了比较好的支持,对于这两种技术的更多、更价值的应用,可能还需要业务人员和开发人员在不断的尝试中才能知道。
参考资料 :
Using the WCF SQL Adapter to read messages from SSB queues and submit them to BizTalk
BizTalk 开发系列(四十) BizTalk WCF-SQL Adapter读取SQL Service Broker消息的更多相关文章
- BizTalk 开发系列(四十一) BizTalk 2010 BAM 安装手记
使用64位系统可以支持更大的内存,现在服务器基本上都使用64位系统.微软从Windows Server 2008 R2开始服务器版的操作系统也只支持64位了,不过对于像BizTalk这种“繁杂的东西” ...
- BizTalk 开发系列(四十二) 为BizTalk应用程序打包不同的环境Binding
我们在使用微软或者其他公司提供的BizTalk应用程序MSI包的时候经常会有一个目标环境的选择选项.该选项可以在不同的环境下使用不同的绑定(BizTalk应用程序配置)感觉很高级. 其实这个非常的简单 ...
- BizTalk开发系列(二十八) MSMQ 适配器
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间 中的任一 ...
- BizTalk开发系列(二十二) 开发自定义Map Functoid
尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况.<BizTalk开发系列 Map扩展开发>介绍了通过使用自定义 XSL ...
- BizTalk开发系列(三十三)BizTalk之Excel终极解决方案
Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapte ...
- BizTalk开发系列(二十五) SQL Adapter
SQL Server 是.NET开发的首选数据库.当然开发BizTalk应用程序很多也离不了SQL Server.针对SQL Server的数据操作BizTalk 提供了SQL Adapter作为与数 ...
- BizTalk 开发系列(三十九) BizTalk Server 2009技术概览
BizTalk Server 2009已经发布一段时间了,之前Beta版发布的时候也写过一篇文章<BizTalk Server 2009 Beta初体验>, 当时比较了2006 R2与20 ...
- BizTalk开发系列(三十八)微软BizTalk Server定价和许可[解读]
做BizTalk的项目一段时间了,但是对BizTalk的价格和许可还不是很了解.给客户设计解决方案时大部分产品都是直接按照企业版的功能来设计,很 少考虑到价格和许可方面的因素,以为这个不是我们的事情或 ...
- BizTalk开发系列(三十五) TCP/IP 适配器
BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...
随机推荐
- Swift3.0语言教程替换子字符串
Swift3.0语言教程替换子字符串 Swift3.0语言教程替换子字符串,替换子字符串其实就是将字符串中的子字符串删除,然后再进行添加.为了让这一繁琐的过程变的简单,NSString提供了替换子字符 ...
- JS 中面向对象的5种写法
//第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = function() { ...
- How to: 执行Action当收到数据时
本文旨在演示ActionBlock的使用. 大致流程: 输入路径--读取字节--计算--传输到打印 // Demonstrates how to provide delegates to ex ...
- SqlServer事务回滚(2)
SQL Server 2008中SQL应用系列--目录索引 SQL事务 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是 ...
- The Parallel Challenge Ballgame[HDU1101]
The Parallel Challenge Ballgame Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- BZOJ1858[Scoi2010]序列操作 题解
题目大意: 有一个01序列,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0:1 a b 把[a, b]区间内的所有数全变成1:2 a b 把[a,b]区间 ...
- ACM cigarettes
cigarettes 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 Tom has many cigarettes. We hypothesized that he ...
- 51Nod 1046 A^B Mod C Label:快速幂
给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^ ...
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
今天关闭一个窗体,报出这样的一个错误"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke.",这个不用多想,肯定是那个地方没有释放掉.既然碰到这个问题, ...
- Node.js 手册查询-1-核心模块方法
Node.js 学习手册 标签(空格分隔): node.js 模块 核心模块 核心模块是被编译成二进制代码,引用的时候只需require表示符即可 os 系统基本信息 os模块可提供操作系统的一些基本 ...