Share via


Lektion 4: Starten einer Konversation und Senden von Nachrichten

Neu: 15. September 2007

In dieser Lektion lernen Sie, eine Konversation zu starten, die sich über zwei Datenbanken in derselben Instanz von Datenbankmodul erstreckt. Sie erfahren auch, wie ein einfacher Anforderung/Antwort-Nachrichtenzyklus durchgeführt und anschließend die Konversation beendet wird.

Vorgehensweisen

Wechseln zur InitiatorDB-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 InitiatorDB zu wechseln, wo Sie die Konversation initiieren werden.

    USE InitiatorDB;
    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, eine Konversation zu starten und eine Anforderungsnachricht an //TgtDB/2DBSample/TargetService in TargetDB 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 und eine Anforderungsnachricht zu erstellen. Anschließend wird 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 [//InitDB/2DBSample/InitiatorService]
         TO SERVICE N'//TgtDB/2DBSample/TargetService'
         ON CONTRACT [//BothDB/2DBSample/SimpleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE [//BothDB/2DBSample/RequestMessage]
          (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Wechseln zur TargetDB-Datenbank

  1. Kopieren Sie den folgenden Code, und fügen Sie ihn in ein Abfrage-Editorfenster ein. Führen Sie ihn danach aus, um den Kontext zur TargetDB-Datenbank zu wechseln, wo Sie die Anforderungsnachricht empfangen und eine Antwortnachricht an die InitiatorDB senden.

    USE TargetDB;
    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. Anschließend wird durch folgende SELECT-Anweisung der Text angezeigt, so dass Sie überprüfen können, ob es dieselbe Nachricht ist, die im vorherigen Schritt gesendet wurde. Die IF-Anweisung testet, ob die empfangene Nachricht eine Anforderungsnachricht ist und ob eine SEND-Anweisung zum Senden einer Antwortnachricht an den Initiator verwendet wird. Es wird auch getestet, ob die END CONVERSATION-Anweisung verwendet wird, 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 TargetQueue2DB;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//BothDB/2DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
            N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE
                [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Wechseln zur InitiatorDB-Datenbank

  1. Kopieren Sie den folgenden Code, und fügen Sie ihn in ein Abfrage-Editorfenster ein. Führen Sie ihn danach aus, um den Kontext zur InitiatorDB-Datenbank zu wechseln, wo Sie die Antwortnachricht empfangen und die Konversation beenden.

    USE InitiatorDB;
    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, um 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 InitiatorQueue2DB;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Nächste Schritte

Damit ist das Lernprogramm abgeschlossen. Lernprogramme sind kurze Übersichten und beschreiben nicht alle verfügbaren Optionen. Lernprogramme weisen eine vereinfachte Logik und Fehlerbehandlung auf, damit die grundlegenden Vorgänge besser hervorgehoben werden können. Zum Erstellen effizienter, zuverlässiger und stabiler Konversationen benötigen Sie komplexeren Code als in dem Beispiel in diesem Lernprogramm.

Zurückkehren zu den Service Broker-Lernprogrammen

Service Broker-Lernprogramme

Siehe auch

Andere Ressourcen

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

Hilfe und Informationen

Informationsquellen für SQL Server 2005