SQL Server Service Broker 示例(转)

Posted 空明流光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server Service Broker 示例(转)相关的知识,希望对你有一定的参考价值。

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 = NHello World!

  -- 开始事务处理.
  BEGIN TRANSACTION;
  -- 定义消息发送处理.
  BEGIN DIALOG @InitDlgHandle
    FROM SERVICE  -- 定义发送服务.
      SayHelloSendService
    TO SERVICE    -- 定义接收服务.
      NSayHelloReceiveService
    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 = NSayHelloMessage
  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;

 

以上是关于SQL Server Service Broker 示例(转)的主要内容,如果未能解决你的问题,请参考以下文章

sql server Service Broker 相关查询

SQL Server Service Broker 的缺点 [关闭]

错误:未启用当前数据库的SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker。

未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker。]

未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker

The SQL Server Service Broker for the current database is not enabled