Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Managed Instance
Dans cette leçon, vous allez apprendre à démarrer une conversation, à effectuer un cycle de message de demande-réponse simple, puis à terminer la conversation.
Procédures
Remarque
Les exemples de code de cet article ont été testés à l’aide de l’exemple de base de données AdventureWorks2025, que vous pouvez télécharger à partir de la Microsoft SQL Server Samples and Community Projects page d’accueil.
Basculer vers la base de données AdventureWorks2008R2
Copiez et collez le code suivant dans une fenêtre éditeur de requête, puis exécutez-la pour basculer le contexte vers la base de données AdventureWorks2008R2.
USE AdventureWorks2008R2; GO
Commencer une conversation et envoyer un message de demande
Copiez et collez le code suivant dans une fenêtre de l’Éditeur de requête, puis exécutez-la pour démarrer une conversation et envoyer un message de demande à AWDB/1DBSample/TargetService. Vous devez exécuter le code dans un bloc, car une variable est utilisée pour passer un handle de boîte de dialogue de
BEGIN DIALOGl’instructionSEND. Le lot exécute l’instructionBEGIN DIALOGpour démarrer la conversation. Il génère un message de requête, puis utilise le handle de boîte de dialogue dans uneSENDinstruction pour envoyer le message de requête sur cette conversation. La dernièreSELECTinstruction affiche le texte du message envoyé.DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RequestMsg AS 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
Recevoir la demande et envoyer une réponse
Copiez et collez le code suivant dans une fenêtre de l’Éditeur de requête, puis exécutez-la pour recevoir le message de réponse de l’initiateur
TargetQueue1DBet renvoyer un message de réponse à l’initiateur. L’instructionRECEIVErécupère le message de requête. L’instruction suivanteSELECTaffiche le texte pour vous permettre de vérifier qu’il s’agit du même message envoyé à la dernière étape. L’instructionIFteste si le message reçu est un type de message de demande et si uneSENDinstruction est utilisée pour renvoyer un message de réponse à l’initiateur. L’instructionEND CONVERSATIONest utilisée pour mettre fin au côté cible de la conversation. L’instruction finaleSELECTaffiche le texte du message de réponse.DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RecvReqMsg AS NVARCHAR (100); DECLARE @RecvReqMsgName AS 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 AS 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
Recevoir la réponse et mettre fin à la conversation
Copiez et collez le code suivant dans une fenêtre de l’Éditeur de requête, puis exécutez-la pour recevoir le message de réponse et terminer la conversation. L’instruction
RECEIVErécupère le message de réponse à partir duInitiatorQueue1DB. L’instructionEND CONVERSATIONmet fin au côté initiateur de la conversation. La dernièreSELECTinstruction affiche le texte du message de réponse afin que vous puissiez confirmer qu’il est identique à ce qui a été envoyé à l’étape précédente.DECLARE @RecvReplyMsg AS NVARCHAR (100); DECLARE @RecvReplyDlgHandle AS 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
Tâches associées
- BEGIN DIALOG CONVERSATION (Transact-SQL)
- SEND (Transact-SQL)
- RECEIVE (Transact-SQL)
- END CONVERSATION (Transact-SQL)
- Applications de Service Broker
Étape suivante
Vous avez terminé un cycle de message de demande-réponse entre AWDB/1DBSample/InitiatorService et AWDB/1DBSample/TargetService. Vous pouvez répéter les étapes de cette leçon à chaque fois que vous souhaitez transmettre une paire de messages demande-réponse. Une fois que vous avez terminé d’examiner les instructions et SEND les REPLY instructions, vous pouvez supprimer tous les objets utilisés par la conversation.