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.