SQL Server Service Broker 简单例子 (转)
SQL Server Service Broker
服务体系结构
消息类型 — 定义应用程序间交换的消息的名称。还可以选择是否验证消息。
约定 — 指定给定会话中的消息方向和消息类型。
队列 — 存储消息。此存储机制使服务间可以进行异步通信。Service Broker 队列还有其他优点,比如自动锁定同一个会话组中的消息。
服务 — 是可寻址的会话端点。Service Broker 消息从一个服务发送到另一个服务。服务指定一个队列来保存消息,还指定一些约定,约定指明该服务可作为“目标”。约定向服务提供一组定义完善的消息类型。
处理的先决条件.
USE master;
GO
ALTER DATABASE 目标数据库
SET ENABLE_BROKER;
GO
-- 如果上面的操作执行后,长时间无反应,有死机的嫌疑,尝试下面的语句。
ALTER DATABASE 目标数据库 SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE 目标数据库 SET ENABLE_BROKER;
GO
USE 目标数据库;
GO
-------------------- Hello World 的例子 --------------------
-- 创建 SayHelloMessage 消息类型.
-- 该消息类型,不做数据验证的处理.
CREATE MESSAGE TYPE SayHelloMessage
VALIDATION = None;
GO
-- 创建 约定 SayHelloContract
-- 定义了,发送/接收方.
-- 都是用这个消息类型.
CREATE CONTRACT SayHelloContract (
SayHelloMessage SENT BY ANY
);
GO
-- 创建发送/接收队列
CREATE QUEUE SayHelloSendQueue;
CREATE QUEUE SayHelloReceiveQueue;
GO
-- 创建发起方服务 SayHelloSendService
-- 该服务使用 SayHelloSendQueue 队列
-- 由于未指定约定名称,因而其他服务不可将此服务用作目标服务。
CREATE SERVICE SayHelloSendService
ON QUEUE SayHelloSendQueue;
GO
-- 创建目标服务 SayHelloReceiveService
-- 该服务使用 SayHelloReceiveQueue 队列
-- 使用 SayHelloContract 约定
CREATE SERVICE SayHelloReceiveService
ON QUEUE SayHelloReceiveQueue
([SayHelloContract]);
GO
-- 测试发送.
BEGIN
-- 定义发送的句柄.
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
-- 定义变量.
DECLARE @MyMessage NVARCHAR(100);
-- 设置发送消息的内容.
SET @MyMessage = N'Hello World!'
-- 开始事务处理.
BEGIN TRANSACTION;
-- 定义消息发送处理.
BEGIN DIALOG @InitDlgHandle
FROM SERVICE -- 定义发送服务.
SayHelloSendService
TO SERVICE -- 定义接收服务.
N'SayHelloReceiveService'
ON CONTRACT -- 定义使用的约定
SayHelloContract
WITH -- 不加密.
ENCRYPTION = OFF;
-- 发送消息.
SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE
[SayHelloMessage]
( @MyMessage );
-- 输出接收到的消息.
PRINT '我发送了:' + @MyMessage;
-- 提交事务.
COMMIT TRANSACTION;
END
GO
-- 测试接收,处理,并反馈.
BEGIN
-- 接收句柄.
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
-- 接收到的数据.
DECLARE @RecvReqMsg NVARCHAR(100);
-- 接收到的数据类型名称.
DECLARE @RecvReqMsgName sysname;
-- 开始事务处理.
BEGIN TRANSACTION;
-- 尝试从 SayHelloReceiveQueue 队列 接收消息.
WAITFOR
( RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM SayHelloReceiveQueue
), TIMEOUT 1000;
-- 如果接收到的消息类型名为 SayHelloMessage
-- 那么进行处理.
IF @RecvReqMsgName = N'SayHelloMessage'
BEGIN
-- 定义准备用于返回的消息.
DECLARE @ReplyMsg NVARCHAR(100);
-- 简单设置.
SELECT @ReplyMsg = '~' + @RecvReqMsg + '~';
-- 调试输出.
PRINT '我接收到:' + @RecvReqMsg + "; 我将反馈:" + @ReplyMsg;
-- 发送反馈消息.
SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
[SayHelloMessage]
(@ReplyMsg);
END CONVERSATION @RecvReqDlgHandle;
END;
-- 提交事务.
COMMIT TRANSACTION;
END
GO
-- 测试获取处理结果.
BEGIN
DECLARE @RecvReplyMsg NVARCHAR(100);
DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
-- 开始事务处理.
BEGIN TRANSACTION;
-- 尝试从 SayHelloReceiveQueue 队列 接收消息.
WAITFOR
( RECEIVE TOP(1)
@RecvReplyDlgHandle = conversation_handle,
@RecvReplyMsg = message_body
FROM SayHelloSendQueue
), TIMEOUT 1000;
END CONVERSATION @RecvReplyDlgHandle;
-- 输出接收到的消息.
PRINT '我接收到反馈:' + @RecvReplyMsg;
-- 提交事务.
COMMIT TRANSACTION;
END
GO
-------------------- Hello World 内部激活的例子 --------------------
-- 专门用于处理消息的存储过程.
CREATE PROCEDURE SayHelloQueueProc
AS
BEGIN
-- 接收句柄.
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
-- 接收到的数据.
DECLARE @RecvReqMsg NVARCHAR(100);
-- 接收到的数据类型名称.
DECLARE @RecvReqMsgName sysname;
-- 循环处理.
WHILE (1=1)
BEGIN
-- 开始事务处理.
BEGIN TRANSACTION;
-- 尝试从 SayHelloReceiveQueue 队列 接收消息.
WAITFOR
( RECEIVE TOP(1)
@RecvReqDlgHandle = conversation_handle,
@RecvReqMsg = message_body,
@RecvReqMsgName = message_type_name
FROM SayHelloReceiveQueue
), TIMEOUT 5000;
-- 判断有没有获取到消息.
IF (@@ROWCOUNT = 0)
BEGIN
-- 如果没有接收到消息
-- 回滚事务.
ROLLBACK TRANSACTION;
-- 跳出循环.
BREAK;
END
-- 如果接收到的消息类型名为 SayHelloMessage
-- 那么进行处理.
IF @RecvReqMsgName = N'SayHelloMessage'
BEGIN
-- 定义准备用于返回的消息.
DECLARE @ReplyMsg NVARCHAR(100);
-- 简单设置.
SELECT @ReplyMsg = '~' + @RecvReqMsg + '~';
-- 调试输出.
PRINT '我接收到:' + @RecvReqMsg + "; 我将反馈:" + @ReplyMsg;
-- 发送反馈消息.
SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
[SayHelloMessage]
(@ReplyMsg);
END CONVERSATION @RecvReqDlgHandle;
END;
-- 提交事务.
COMMIT TRANSACTION;
END
END
GO
-- 更改目标队列以指定内部激活
-- 也就是当有消息发送到 SayHelloReceiveQueue 队列的时候.
-- 自动调用 SayHelloQueueProc 存储过程 进行处理.
ALTER QUEUE SayHelloReceiveQueue
WITH ACTIVATION
( STATUS = ON,
PROCEDURE_NAME = SayHelloQueueProc,
MAX_QUEUE_READERS = 10,
EXECUTE AS SELF
);
GO
-- 由于消息已经处于自动处理的方式。
-- 测试发送 并 接收.
BEGIN
-- 定义发送的句柄.
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
-- 定义变量.
DECLARE @MyMessage NVARCHAR(100);
-- 设置发送消息的内容.
SET @MyMessage = N'Hello World!'
-- 开始事务处理.
BEGIN TRANSACTION;
-- 定义消息发送处理.
BEGIN DIALOG @InitDlgHandle
FROM SERVICE -- 定义发送服务.
SayHelloSendService
TO SERVICE -- 定义接收服务.
N'SayHelloReceiveService'
ON CONTRACT -- 定义使用的约定
SayHelloContract
WITH -- 不加密.
ENCRYPTION = OFF;
-- 发送消息.
SEND ON CONVERSATION @InitDlgHandle
MESSAGE TYPE
[SayHelloMessage]
( @MyMessage );
-- 输出接收到的消息.
PRINT '我发送了:' + @MyMessage;
-- 提交事务.
COMMIT TRANSACTION;
-- 等待 5 秒.
WAITFOR DELAY '00:00:05';
DECLARE @RecvReplyMsg NVARCHAR(100);
DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
-- 开始事务处理.
BEGIN TRANSACTION;
-- 尝试从 SayHelloReceiveQueue 队列 接收消息.
WAITFOR
( RECEIVE TOP(1)
@RecvReplyDlgHandle = conversation_handle,
@RecvReplyMsg = message_body
FROM SayHelloSendQueue
), TIMEOUT 1000;
END CONVERSATION @RecvReplyDlgHandle;
-- 输出接收到的消息.
PRINT '我接收到反馈:' + @RecvReplyMsg;
-- 提交事务.
COMMIT TRANSACTION;
END
GO
我发送了:Hello World!
(1 行受影响)
我接收到反馈:~Hello World!~
SQL Server Service Broker 简单例子 (转)的更多相关文章
- Reusing dialogs with a dialog pool--一个sql server service broker例子
一个sql server service broker例子 ----------------------------------- USE master GO -------------------- ...
- SQL Server Service Broker创建单个数据库会话
概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...
- SQL Server Service Broker创建单个数据库会话(消息队列)
概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...
- The SQL Server Service Broker for the current database is not enabled
把一个数据恢复至另一个服务器上,出现了一个异常: The SQL Server Service Broker for the current database is not enabled, and ...
- 在Windows Server 2008 R2 Server中,连接其他服务器的数据库遇到“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker ”
项目代码和数据库部署在不同的Windows Server 2008 R2 Server中,错误日志显示如下: "未启用当前数据库的 SQL Server Service Broker,因此查 ...
- SQL Server Service Broker(简称SSB)资料
SQL server Service Broker (下面简称SSB) 是SQL server 里面比较独特的一个功能.它可帮助开发人员构建异步的松散耦合应用程序.SSB的一些功能和好处包括有: 数据 ...
- sql server Service Broker 相关查询
sql server Service Broker 相关查询 -- 查看传输队列中的消息 --如果尝试从队列中移除时,列将表明哪里出现了问题 select * from sys.transmissio ...
- SQL问题:未启用当前数据库的 SQL Server Service Broker
数据库分离后,附加回到数据库,然后在程序中打开调用数据库的页面,出现如下问题:“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数 ...
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
昨晚遇到的这个问题,也知道Notifications service依赖底层的Service broker的.本以为只需要执行以下脚本对数据库启用Service broker即可. alter dat ...
随机推荐
- 洛谷P1345 [USACO5.4]奶牛的电信 [最小割]
题目传送门 奶牛的电信 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,..., ...
- 洛谷P3434 [POI2006]KRA-The Disks [模拟]
题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...
- Python并发编程-线程-一个简单的例子
from threading import Thread import time def func(n): #子线程完成的 time.sleep(1) print(n) #多线程示例 for i in ...
- python升级带来的yum异常:File "/usr/bin/yum", line 30
问题: $ yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxError: invalid ...
- Windows群集之NLB
转http://www.aixchina.net/Article/31746 网络负载平衡群集(Network Load balancing) 在Internet快速发展的今天,为了满足企业的高速发展 ...
- HDU1251 统计难题 trie树 简单
http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 找前缀数量 裸模板 #include<cstdio> #include<cstr ...
- [ZROI 9.16模拟赛] Tutorial
Link: 传送门 A: 套路题结果想了好久…… 排序二叉树的性质就是中序遍历单调递增 于是只考虑当前树的中序遍历的序列即可,与树的形态无关 将序列改成严格单调增想到最大化不变的数,但直接LIS求的是 ...
- 哈希表(散列表)—Hash表解决地址冲突 C语言实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...
- VK Cup 2016 - Qualification Round 2 B. Making Genome in Berland 水题
B. Making Genome in Berland 题目连接: http://www.codeforces.com/contest/638/problem/B Description Berlan ...
- layer弹框,弹出后自动关闭
今天做项目,出现一个问题,需求是用ajax做文件上传功能,代码写好之后,测试发现问题. 弹出层出现以后我没有主动点击确定和关闭等操作,程序自动关闭了弹出层 一步一步排查,找到了错误,首先,先确认你页面 ...