共用方式為


第 2 課:開始交談並傳輸訊息

新增: 2007 年 9 月 15 日

在本課程中,您將學習開始交談、完成簡單要求-回覆訊息循環,然後結束交談。

程序

切換至 AdventureWorks 資料庫

  1. 複製下列程式碼並在 [查詢編輯器] 視窗中貼上,然後執行,即可將內容切換為 AdventureWorks 資料庫。

    USE AdventureWorks;
    GO
    

開始交談並傳送要求訊息

  1. 複製下列程式碼並在 [查詢編輯器] 視窗中貼上,然後執行,即可開始交談並傳送要求訊息至 //AWDB/1DBSample/TargetService。因為會使用變數將對話控制代碼從 BEGIN DIALOG 傳遞至 SEND 陳述式,所以必須在同一個區塊中執行程式碼。有一個批次會執行 BEGIN DIALOG 陳述式,以開始交談。它會建立要求訊息,然後在 SEND 陳述式中使用對話控制代碼,對此交談傳送要求訊息。最後的 SELECT 陳述式會顯示所傳送之訊息的文字。

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/1DBSample/InitiatorService]
         TO SERVICE
          N'//AWDB/1DBSample/TargetService'
         ON CONTRACT
          [//AWDB/1DBSample/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/1DBSample/RequestMessage]
         (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

接收要求並傳送回覆

  1. 複製下列程式碼並在 [查詢編輯器] 視窗中貼上,然後執行,即可從 TargetQueue2DB 接收回覆訊息,並將回覆訊息傳送回起始端。RECEIVE 陳述式會擷取要求訊息。下列 SELECT 陳述式會顯示文字,以便您確認是否為上一個步驟中傳送的相同訊息。IF 陳述式會測試收到的訊息是否為要求訊息類型,以及是否使用 SEND 陳述式,將回覆訊息傳回起始端。END CONVERSATION 陳述式是用來結束交談的目標端。最後的 SELECT 陳述式會顯示回覆訊息的文字。

    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg NVARCHAR(100);
    DECLARE @RecvReqMsgName sysname;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
    FROM TargetQueue1DB;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//AWDB/1DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
         N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE 
              [//AWDB/1DBSample/ReplyMessage]
              (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

接收回覆並結束交談

  1. 複製下列程式碼並在 [查詢編輯器] 視窗中貼上,然後執行,即可接收回覆訊息並結束交談。RECEIVE 陳述式會擷取來自 InitiatorQueue2DB 的回覆訊息。END CONVERSATION 陳述式會結束交談的起始端。最後的 SELECT 陳述式會顯示回覆訊息的文字,以便您確認是否和上一個步驟中傳送的訊息相同。

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueue1DB;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

後續的步驟

您已成功完成 //AWDB/1DBSample/InitiatorService//AWDB/1DBSample/TargetService 之間的要求-回覆訊息循環。您可以隨意重複本課程中的步驟許多次,以傳輸訊息的要求-回覆組。當您研究過 SEND 和 REPLY 陳述式之後,就可以卸除交談使用的所有物件。如需詳細資訊,請參閱<第 3 課:卸除交談物件>。

請參閱

其他資源

BEGIN DIALOG CONVERSATION (Transact-SQL)
SEND (Transact-SQL)
RECEIVE (Transact-SQL)
END CONVERSATION (Transact-SQL)
Service Broker Programming Basics

說明及資訊

取得 SQL Server 2005 協助