1.定义数据类型、协议和服务(发送服务和接收服务)

USE master;
GO ALTER DATABASE 目标数据库
SET ENABLE_BROKER;
GO -- 如果上面的操作执行后,长时间无反应,有死机的嫌疑,尝试下面的语句。
ALTER DATABASE 目标数据库 SET NEW_BROKER WITH ROLLBACK IMMEDIATE; GO
ALTER DATABASE 目标数据库 SET ENABLE_BROKER; GO
-- 创建 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

2. 发送消息

-- 定义发送的句柄.
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;

3.接收消息

-- 接收句柄.
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 + '~';
-- 调试输出. declare @t nvarchar(max) PRINT '我接收到:' + @RecvReqMsg + '; 我将反馈:' + @ReplyMsg;
-- 发送反馈消息.
--SEND ON CONVERSATION @RecvReqDlgHandle
-- MESSAGE TYPE
-- [SayHelloMessage]
-- (@ReplyMsg);
--END CONVERSATION @RecvReqDlgHandle;
END;
-- 提交事务.
COMMIT TRANSACTION;

4.存储过程与队列绑定,当有消息时自动处理。

ALTER QUEUE SayHelloReceiveQueue
WITH ACTIVATION
( STATUS = ON,
PROCEDURE_NAME = SayHelloQueueProc,
MAX_QUEUE_READERS = 10,
EXECUTE AS SELF
);
GO
ALTER 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; insert into t_Msg(Msg) values(@RecvReqMsg); -- 发送反馈消息.
SEND ON CONVERSATION @RecvReqDlgHandle
MESSAGE TYPE
[SayHelloMessage]
(@ReplyMsg);
END CONVERSATION @RecvReqDlgHandle;
END;
-- 提交事务.
COMMIT TRANSACTION;
END
END
GO

SQL Server Service Broker 示例(转)的更多相关文章

  1. SQL Server Service Broker创建单个数据库会话

    概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...

  2. SQL Server Service Broker创建单个数据库会话(消息队列)

    概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...

  3. 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 ...

  4. 在Windows Server 2008 R2 Server中,连接其他服务器的数据库遇到“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker ”

    项目代码和数据库部署在不同的Windows Server 2008 R2 Server中,错误日志显示如下: "未启用当前数据库的 SQL Server Service Broker,因此查 ...

  5. SQL Server Service Broker(简称SSB)资料

    SQL server Service Broker (下面简称SSB) 是SQL server 里面比较独特的一个功能.它可帮助开发人员构建异步的松散耦合应用程序.SSB的一些功能和好处包括有: 数据 ...

  6. SQL Server Service Broker 简单例子 (转)

    SQL Server Service Broker服务体系结构 消息类型 — 定义应用程序间交换的消息的名称.还可以选择是否验证消息.约定 — 指定给定会话中的消息方向和消息类型.队列 — 存储消息. ...

  7. sql server Service Broker 相关查询

    sql server Service Broker 相关查询 -- 查看传输队列中的消息 --如果尝试从队列中移除时,列将表明哪里出现了问题 select * from sys.transmissio ...

  8. Reusing dialogs with a dialog pool--一个sql server service broker例子

    一个sql server service broker例子 ----------------------------------- USE master GO -------------------- ...

  9. SQL问题:未启用当前数据库的 SQL Server Service Broker

    数据库分离后,附加回到数据库,然后在程序中打开调用数据库的页面,出现如下问题:“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数 ...

随机推荐

  1. Spring事务操作介绍

    Spring的特色之一,简单而强大的事务管理功能,包括编程式事务和声明式事务. 1. Spring中涉及到事务管理的API有100多个,核心的只有三个: TransactionDefinition.P ...

  2. 背景图片利用backgrond-posintion属性实现不同形式的分割

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. .net webService保存全局变量中

    遇到坑,然后找到解决方案,我就习惯做个记录. 情景:通过webservice调用一个第三方的库,在初始化第三方库的时候需要花费较长时间 目的:希望通过初始化一次,缓存下来,下次直接调用,而不必每次初始 ...

  4. Windows 10 远程桌面出现身份验证错误:要求的函数不受支持(解决)

    爬梯子还是快一些,百度搜一年也搜不到~~~囧 给出原始地址,百度的某些解决方案不知道是不是截取过来搞错了还是啥,返回和原始方案就差一丢丢,浪费时间. https://windowsreport.com ...

  5. 算数运算符& 关系运算符

    java中的算数运算符 + - * / % ++ -- + +: 加法运算符 - : 减法运算符 *: 乘法运算符 / : 除法运算符 注意: 除数不能为0,除数为0会报出异常 整数运算默认得到整数, ...

  6. wifi编辑 centos

    ifconfig -a sudo iw dev 设置名称 scan

  7. Linux系统中安装Oracle数据库

    安装前的准备 三个包:winx64_12201_database.zip(oracle数据库) window_7(安装在虚拟机中的window7纯净版系统) client.zip(oracle的监听器 ...

  8. Thymeleaf中href与 th:href的区别

    语法格式如下: <a th:href="@{/channel/page/add}">添加渠道 </a> <a href="/channel/ ...

  9. vue+element-ui实现表格编辑(增加或删除行,删除单行或删除多行)

    <template> <div class="app-container"> <div class="filter-container&qu ...

  10. 剑指Offer 66. 机器人的运动范围 (回溯)

    题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...