Lektion 4: Starten einer Konversation und Übertragen von Nachrichten

In dieser Lektion erfahren Sie, wie Sie eine Konversation starten, die sich über zwei Datenbanken in derselben Instanz von Database Engine (Datenbankmodul) erstreckt. Außerdem lernen Sie, wie ein einfacher Anforderungs-Antwort-Nachrichtenzyklus vervollständigt und die Konversation anschließend beendet wird.

Verfahrensweisen

Wechseln zur InitiatorDB-Datenbank

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um den Kontext zur InitiatorDB-Datenbank zu wechseln, wo Sie die Konversation initiieren.

    USE InitiatorDB;
    GO
    

Starten einer Konversation und Senden einer Anforderungsnachricht

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um eine Konversation zu starten und eine Anforderungsnachricht zum //TgtDB/2DBSample/TargetService in der TargetDB zu senden. Der Code muss in einem Block ausgeführt werden, da eine Variable verwendet wird, um einen Dialoghandle von BEGIN DIALOG an die SEND-Anweisung zu übergeben. Der Batch führt die BEGIN DIALOG-Anweisung aus, um die Konversation zu starten und eine Anforderungsnachricht zu erstellen. Anschließend verwendet er den Dialoghandle in einer SEND-Anweisung, um die Anforderungsnachricht für diese Konversation zu senden. 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

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um den Kontext zur TargetDB-Datenbank zu wechseln, in der Sie die Anforderungsnachricht erhalten und eine Antwortnachricht an InitiatorDB senden.

    USE TargetDB;
    GO
    

Empfangen der Anforderung und Senden einer Antwort

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um die Antwortnachricht von TargetQueue2DB zu empfangen und eine Antwortnachricht an den Initiator zu senden. Die RECEIVE-Anweisung ruft die Anforderungsnachricht ab. Anschließend zeigt die folgende SELECT-Anweisung den Text an, sodass Sie prüfen können, ob es sich um dieselbe Nachricht handelt, die im vorherigen Schritt gesendet wurde. Die IF-Anweisung prüft, ob die empfangene Nachricht eine Anforderungsnachricht ist. Wenn dies der Fall ist, wird mithilfe einer SEND-Anweisung eine Antwortnachricht an den Initiator gesendet. Außerdem prüft die Anweisung, 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;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
      FROM TargetQueue2DB
    ), TIMEOUT 1000;
    
    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

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um den Kontext wieder zur InitiatorDB-Datenbank zu wechseln, in der Sie die Antwortnachricht erhalten und die Konversation beenden.

    USE InitiatorDB;
    GO
    

Empfangen der Antwort und Beenden der Konversation

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um die Antwortnachricht zu empfangen und die Konversation zu beenden. Die RECEIVE-Anweisung ruft die Antwortnachricht aus InitiatorQueue2DB ab. Die END CONVERSATION-Anweisung beendet die Initiatorseite der Konversation. Die letzte SELECT-Anweisung zeigt den Text der Antwortnachricht an, sodass Sie bestätigen können, dass diese Nachricht mit der im vorherigen Schritt gesendeten Nachricht identisch ist.

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
      FROM InitiatorQueue2DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Nächste Schritte

Damit ist das Lernprogramm beendet. Lernprogramme sind nur kurze Einführungen. Sie beschreiben nicht alle verfügbaren Optionen. Lernprogramme verwenden eine vereinfachte Logik und Fehlerbehandlung und sollten nicht in einer Produktionsumgebung verwendet werden.Um effiziente, zuverlässige und stabile Konversationen zu erstellen, benötigen Sie komplexeren Code als in dem Beispiel in diesem Lernprogramm.

Zu den Service Broker-Lernprogrammen zurückkehren

Service Broker-Lernprogramme