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