Freigeben über


Lektion 2: Starten einer Konversation und Senden von Nachrichten

Neu: 15. September 2007

In dieser Lektion lernen Sie, eine Konversation zu starten, einen einfachen Anforderung/Antwort-Nachrichtenzyklus durchzuführen und anschließend die Konversation zu beenden.

Vorgehensweisen

Wechseln zur AdventureWorks-Datenbank

  1. Kopieren Sie den folgenden Code, und fügen Sie ihn in ein Abfrage-Editorfenster ein. Führen Sie ihn dann aus, um den Kontext zur Datenbank AdventureWorks zu wechseln.

    USE AdventureWorks;
    GO
    

Starten einer Konversation und Senden einer Anforderungsnachricht

  1. Kopieren Sie den folgenden Code, und fügen Sie ihn in ein Abfrage-Editorfenster ein. Führen Sie ihn dann aus, um eine Konversation zu starten und eine Anforderungsnachricht an //AWDB/1DBSample/TargetService zu senden. Der Code muss in einem Block ausgeführt werden, weil eine Variable zum Weiterleiten eines Dialoghandles von der BEGIN DIALOG-Anweisung zur SEND-Anweisung verwendet wird. Der Batch führt die BEGIN DIALOG-Anweisung aus, um die Konversation zu starten. Es wird eine Anforderungsnachricht erstellt und anschließend mithilfe des Dialoghandles in einer SEND-Anweisung die Anforderungsnachricht in dieser Konversation gesendet. Die letzte SELECT-Anweisung zeigt den Text der gesendeten Nachricht an.

    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
    

Empfangen der Anforderung und Senden einer Antwort

  1. Kopieren Sie den folgenden Code, und fügen Sie ihn in ein Abfrage-Editorfenster ein. Führen Sie ihn danach aus, um die Antwortnachricht aus TargetQueue2DB zu empfangen und eine Antwortnachricht an den Initiator zu senden. Die RECEIVE-Anweisung ruft die Anforderungsnachricht ab. Durch folgende SELECT-Anweisung wird der Text angezeigt, so dass Sie überprüfen können, ob es dieselbe Nachricht ist, die im letzten Schritt gesendet wurde. Die IF-Anweisung testet, ob die empfangene Nachricht eine Anforderungsnachricht ist und ob eine SEND-Anweisung zum Senden der Antwortnachricht an den Initiator verwendet wurde. Die END CONVERSATION-Anweisung wird verwendet, um die Zielseite der Konversation zu beenden. Die abschließende SELECT-Anweisung zeigt den Text der Antwortnachricht an.

    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
    

Empfangen der Antwort und Beenden der Konversation

  1. Kopieren Sie den folgenden Code, und fügen Sie ihn in ein Abfrage-Editorfenster ein. Führen Sie ihn dann aus, die Antwortnachricht zu empfangen und die Konversation zu beenden. Die RECEIVE-Anweisung ruft die Antwortnachricht von InitiatorQueue2DB ab. Die END CONVERSATION-Anweisung beendet die Initiatorseite der Konversation. Die letzte SELECT-Anweisung zeigt den Text der Antwortnachricht an. Sie können so sicherstellen, dass sie mit der im vorherigen Schritt gesendeten übereinstimmt.

    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
    

Nächste Schritte

Sie haben erfolgreich einen Anforderung/Antwort-Nachrichtenzyklus zwischen //AWDB/1DBSample/InitiatorService und //AWDB/1DBSample/TargetService durchgeführt. Sie können die Schritte in dieser Lektion so oft wiederholen, wie Sie ein Anforderung/Antwort-Nachrichtenpaar übertragen möchten. Wenn Sie die SEND- und REPLY-Anweisungen untersucht haben, können Sie alle von dieser Konversation verwendeten Objekte löschen. Weitere Informationen finden Sie unter Lektion 3: Löschen der Konversationsobjekte.

Siehe auch

Andere Ressourcen

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

Hilfe und Informationen

Informationsquellen für SQL Server 2005