Leçon 4 : 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 qui s’étend sur deux bases de données dans la même instance du moteur de base de données. Vous allez également apprendre à effectuer un cycle de message de demande-réponse simple, puis à terminer la conversation.

Procédures

Basculer vers la base de données InitiatorDB

  • 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 InitiatorDB où vous lancez la conversation.

    USE InitiatorDB;
    GO
    

Démarrer 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 à TgtDB/2DBSample/TargetService dans TargetDB. Le code doit être exécuté 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 commencer la conversation et générer un message de requête. Ensuite, il utilise le handle de boîte de dialogue dans une SEND instruction pour envoyer le message de demande 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 [//InitDB/2DBSample/InitiatorService]
        TO SERVICE N'//TgtDB/2DBSample/TargetService'
        ON CONTRACT [//BothDB/2DBSample/SimpleContract]
        WITH ENCRYPTION = OFF;
    
    SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION (@InitDlgHandle)
        MESSAGE TYPE [//BothDB/2DBSample/RequestMessage] (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Basculer vers la base de données TargetDB

  • Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête. Ensuite, exécutez-le pour basculer vers la TargetDB base de données où vous recevez le message de demande et renvoyez un message de réponse à la InitiatorDBbase de données .

    USE TargetDB;
    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 TargetQueue2DB et renvoyer un message de réponse à l’initiateur. L’instruction RECEIVE récupère le message de requête. Ensuite, l’instruction suivante SELECT affiche le texte pour vous permettre de 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 type de message de demande et si une SEND instruction est utilisée pour renvoyer un message de réponse à l’initiateur. Il teste également si 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 TargetQueue2DB),
    TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName = N'//BothDB/2DBSample/RequestMessage'
        BEGIN
            DECLARE @ReplyMsg AS NVARCHAR (100);
            SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
            SEND ON CONVERSATION (@RecvReqDlgHandle)
                MESSAGE TYPE [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg);
            END CONVERSATION @RecvReqDlgHandle;
        END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Basculer vers la base de données InitiatorDB

  • Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête. Ensuite, exécutez-le pour revenir au contexte vers la base de données InitiatorDB où vous recevez le message de réponse et terminez la conversation.

    USE InitiatorDB;
    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 de l’InitiatorQueue2DB. 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 InitiatorQueue2DB),
    TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display received request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO