第 2 課:建立內部啟用程序
在這一課,您將學會建立一個預存程序,以便處理來自 Service Broker 佇列的訊息。此外,您也將學會如何指定只要佇列中有訊息,就會隨時啟動此程序。
程序
切換至 AdventureWorks2008R2 資料庫
將下列程式碼複製並貼入 [查詢編輯器] 視窗中。然後,執行此程式碼以便將內容切換至 AdventureWorks2008R2 資料庫。
USE AdventureWorks2008R2; GO
建立內部啟用預存程序
將下列程式碼複製並貼入 [查詢編輯器] 視窗中。然後,執行此程式碼,以便建立預存程序。當程式碼執行時,只要佇列中存在訊息,預存程序就會一直接收訊息。如果接收作業逾時,但沒有傳回訊息,預存程序就會結束。如果接收的訊息是要求訊息,預存程序就會傳回回覆訊息。如果接收的訊息是 EndDialog 訊息,預存程序就會結束交談的目標端。如果接收的訊息是 Error 訊息,它就會回復交易。
CREATE PROCEDURE TargetActivProc AS DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; WHILE (1=1) BEGIN BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueueIntAct ), TIMEOUT 5000; IF (@@ROWCOUNT = 0) BEGIN ROLLBACK TRANSACTION; BREAK; END IF @RecvReqMsgName = N'//AWDB/InternalAct/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//AWDB/InternalAct/ReplyMessage] (@ReplyMsg); END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' BEGIN END CONVERSATION @RecvReqDlgHandle; END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/Error' BEGIN END CONVERSATION @RecvReqDlgHandle; END COMMIT TRANSACTION; END GO
更改目標佇列,以便指定內部啟用
將下列程式碼複製並貼入 [查詢編輯器] 視窗中。然後,執行該程式碼以指定 Service Broker 啟動 TargetActiveProc 預存程序來處理從 TargetQueueIntAct 發出的訊息。只要 TargetQueueIntAct 中接收到訊息且尚未執行任何程序,Service Broker 隨時都會執行一份 TargetActiveProc。而只要現有複本與傳入訊息數不符,Service Broker 就會再執行其他 TargetActiveProc 複本。
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
後續的步驟
您已成功將 AdventureWorks2008R2 設定為支援 //AWDB/InternalAct/InitiatorService 與 //AWDB/InternalAct/TargetService 之間的交談。在下一課,您將使用此組態來完成交談。請參閱<第 3 課:開始交談和傳輸訊息>。