Lektion 2: Starten einer Konversation und Übertragen von Nachrichten

In dieser Lektion erfahren Sie, wie Sie eine Konversation starten, einen einfachen Anforderungs-Antwort-Nachrichtenzyklus abschließen und die Konversation dann beenden.

Verfahrensweisen

Wechseln zur AdventureWorks-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 AdventureWorks-Datenbank zu wechseln.

    USE AdventureWorks;
    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 an //AWDB/1DBSample/TargetService 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. Der Code erstellt eine Anforderungsnachricht und verwendet dann 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
          [//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

  • 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 TargetQueue1DB zu empfangen und eine Antwortnachricht an den Initiator zu senden. Die RECEIVE-Anweisung ruft die Anforderungsnachricht ab. Die folgende SELECT-Anweisung zeigt den Text an, sodass Sie prüfen können, ob es sich um dieselbe Nachricht handelt, die im letzten 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. 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;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
      FROM TargetQueue1DB
    ), TIMEOUT 1000;
    
    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

  • 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 InitiatorQueue1DB 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 InitiatorQueue1DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Nächste Schritte

Sie haben einen Anforderungs-Antwort-Nachrichtenzyklus zwischen //AWDB/1DBSample/InitiatorService und //AWDB/1DBSample/TargetService erfolgreich abgeschlossen. Sie können die Schritte aus dieser Lektion beliebig oft wiederholen, um ein Anforderungs-Antwort-Nachrichtenpaar zu übertragen. Wenn Sie die Prüfung der SEND- und REPLY-Anweisungen abgeschlossen haben, können Sie alle Objekte löschen, die von der Konversation verwendet wurden. Weitere Informationen finden Sie unter Lektion 3: Löschen der Zielkonversationsobjekte.