Leçon 2 : Commencer une conversation et transmettre des messages

S’applique à :SQL ServerAzure 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 DIALOG l’instruction SEND . Le lot exécute l’instruction BEGIN DIALOG pour démarrer la conversation. Il génère un message de requête, puis utilise le handle de boîte de dialogue dans une SEND instruction pour envoyer le message de requête sur cette conversation. La dernière SELECT instruction 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 TargetQueue1DB et renvoyer un message de réponse à l’initiateur. L’instruction RECEIVE récupère le message de requête. L’instruction suivante SELECT affiche le texte pour vous permettre de vérifier qu’il s’agit du même message envoyé à la dernière étape. L’instruction IF teste si le message reçu est un type de message de demande et si une SEND instruction est utilisée pour renvoyer un message de réponse à l’initiateur. L’instruction END CONVERSATION est utilisée pour mettre fin au côté cible de la conversation. L’instruction finale SELECT affiche 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 RECEIVE récupère le message de réponse à partir du InitiatorQueue1DB. L’instruction END CONVERSATION met fin au côté initiateur de la conversation. La dernière SELECT instruction 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
    

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