Lektion 3: Starten einer Konversation und Übertragen von Nachrichten

In dieser Lektion erfahren Sie, wie ein einfacher Anforderungs-Antwort-Nachrichtenzyklus in einem mit einer gespeicherten Prozedur für die interne Aktivierung konfigurierten System abgeschlossen wird.

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/InternalAct/TargetService zu senden. Der Code muss in einem Block ausgeführt werden, da eine Variable verwendet wird, um ein 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/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Empfangen der Anforderung und Senden einer Antwort

  • Wenn Sie die Anforderungsnachricht senden, aktiviert Service Broker automatisch eine Kopie von TargetActiveProc. Die gespeicherte Prozedur empfängt die Antwortnachricht von TargetQueueIntAct und sendet eine Antwortnachricht an den Initiator.

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 InitiatorQueueIntAct ab. Die END CONVERSATION-Anweisung beendet die Initiatorseite der Konversation und sendet eine EndDialog-Nachricht an den Zieldienst. 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 InitiatorQueueIntAct
    ), TIMEOUT 5000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Beenden der Zielseite der Konversation

  • Wenn Sie die END CONVERSATION-Anweisung für den Initiator ausführen, sendet Service Broker eine EndDialog-Nachricht an die Warteschlange TargetQueueIntAct. Die Prozedur TargetActiveProc empfängt die EndDialog-Nachricht und gibt eine END CONVERSATION-Anweisung aus, durch die die Zielseite der Konversation beendet wird.

Nächste Schritte

Sie haben einen Anforderungs-Antwort-Nachrichtenzyklus zwischen //AWDB/InternalAct/InitiatorService und //AWDB/InternalAct/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 4: Löschen der Zielkonversationsobjekte.