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.接收消息spa

-- 接收句柄.
  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
相關文章
相關標籤/搜索