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
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
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
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
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
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
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
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