第 2 課:建立內部啟動程序
在這一課,您將學會建立一個預存程序,以便處理來自 Service Broker 佇列的訊息。此外,您也將學會如何指定每次佇列中存在訊息時便啟動此程序。
程序
切換至 AdventureWorks 資料庫
將下列程式碼複製並貼入 [查詢編輯器] 視窗中。然後,執行此程式碼以便將內容切換至 AdventureWorks 資料庫。
USE AdventureWorks; 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
後續步驟
您已成功將 AdventureWorks 設定為支援 //AWDB/InternalAct/InitiatorService 與 //AWDB/InternalAct/TargetService 之間的交談。在下一課,您將使用此組態來完成交談。請參閱<第 3 課:開始交談和傳輸訊息>。