Leçon 2 : début d'une conversation et transmission de messages

Dans cette leçon, vous allez apprendre à engager une conversation, exécuter un cycle de message demande-réponse simple, puis mettre fin à la conversation.

Procédures

Basculer vers la base de données AdventureWorks2008R2

  • Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête. Ensuite, exécutez-le 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-le pour démarrer une conversation et envoyer un message de demande à //AWDB/1DBSample/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 démarrer 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/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-le pour recevoir le message de réponse provenant de TargetQueue1DB et envoyer un message de réponse à l'initiateur. L'instruction RECEIVE récupère le message de demande. L'instruction SELECT suivante affiche le texte afin que vous puissiez vérifier qu'il s'agit du même message envoyé à l'étape précédente. L'instruction IF teste si le message reçu est un message de demande et si une instruction SEND est utilisée pour envoyer un message de réponse à l'initiateur. L'instruction END CONVERSATION est utilisée pour mettre fin à la conversation du côté de la cible. La dernière instruction SELECT affiche le texte du message de réponse.

    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
    

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-le pour recevoir le message de réponse et mettre fin à la conversation. L'instruction RECEIVE récupère le message de réponse dans InitiatorQueue1DB. L'instruction END CONVERSATION met fin à la conversation du côté de l'initiateur. 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 InitiatorQueue1DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Étapes suivantes

Vous venez d'accomplir un cycle de message 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. 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 3 : suppression des objets de la conversation.