Leçon 3 : lancement d'une conversation et transmission de messages
Dans cette leçon, vous allez apprendre à exécuter un cycle de messages simple de type demande-réponse dans un système configuré avec une procédure stockée d'activation interne.
Procédures
Basculer vers la base de données AdventureWorks
Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête. puis, exécutez-le pour basculer le contexte vers la base de données AdventureWorks.
USE AdventureWorks; GO
Lancer 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-le pour lancer une conversation et envoyer un message de demande à //AWDB/InternalAct/TargetService. Le code doit être exécuté en un seul bloc car une variable est utilisée pour passer un handle de dialogue de l'instruction BEGIN DIALOG à l'instruction SEND. Le lot exécute l'instruction BEGIN DIALOG pour lancer la conversation. Il génère un message de demande, puis utilise le handle de dialogue dans une instruction SEND pour envoyer le message de demande sur cette conversation. La dernière instruction SELECT affiche le texte du message envoyé.
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
Recevoir la demande et envoyer une réponse
- Lorsque vous envoyez le message de demande, Service Broker active automatiquement une copie de TargetActiveProc. La procédure stockée reçoit le message de réponse provenant de TargetQueueIntAct et renvoie un message de réponse à l'initiateur.
Recevoir la réponse et terminer la conversation
Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête, puis, exécutez-le pour recevoir le message de réponse et terminer la conversation. L'instruction RECEIVE récupère le message de réponse dans InitiatorQueueIntAct. L'instruction END CONVERSATION termine la conversation côté initiateur et envoie un message EndDialog au service cible. La dernière instruction SELECT affiche le texte du message de réponse afin que vous puissiez vérifier qu'il s'agit du même que celui envoyé à l'étape précédente.
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
Terminer la conversation côté cible
- Lorsque vous exécutez l'instruction END CONVERSATION pour l'initiateur, Service Broker envoie un message EndDialog à la file d'attente TargetQueueIntAct. La procédure TargetActiveProc reçoit le message EndDialog et publie une instruction END CONVERSATION qui termine la conversation côté cible.
Étapes suivantes
Vous venez d'exécuter avec succès un cycle de messages de type demande-réponse entre //AWDB/InternalAct/InitiatorService et //AWDB/InternalAct/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. Lorsque vous avez fini d'étudier les instructions SEND et REPLY, vous pouvez supprimer tous les objets utilisés par la conversation. Pour plus d'informations, consultez Leçon 4 : suppression des objets de la conversation.