共用方式為


第 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 課:開始交談和傳輸訊息>。