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 = 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM