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

Dans cette leçon, vous apprendrez à démarrer une conversation entre deux bases de données dans la même instance du Moteur de base de données. Vous apprendrez également à accomplir un cycle de message demande-réponse avant de mettre fin à la conversation.

Procédures

Basculer vers la base de données InitiatorDB

  • 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 InitiatorDB dans laquelle vous allez engager 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-le pour commencer une conversation et envoyer un message de demande à //TgtDB/2DBSample/TargetService dans TargetDB. 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 commencer la conversation et générer un message de demande. Puis, il 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 [//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. Puis, exécutez-le pour basculer le contexte vers la base de données TargetDB dans laquelle vous recevrez le message de demande et à partir de laquelle vous enverrez un message de réponse à la base de données InitiatorDB.

    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-le pour recevoir le message de réponse provenant de TargetQueue2DB et envoyer un message de réponse à l'initiateur. L'instruction RECEIVE récupère le message de demande. Puis, 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. Elle teste également si 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 TargetQueue2DB
    ), TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//BothDB/2DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg 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. Puis, exécutez-le pour rebasculer le contexte vers la base de données InitiatorDB dans laquelle vous recevrez le message de réponse et mettrez fin à 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 dans InitiatorQueue2DB. 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 InitiatorQueue2DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Étapes suivantes

Cela conclut le didacticiel. Les didacticiels sont uniquement des vues d'ensemble. Ils ne décrivent pas toutes les options disponibles. Les didacticiels utilisent une logique et une gestion des erreurs simplifiées et ne devraient pas être utilisés dans un environnement de production.Pour créer des conversations efficaces, fiables et solides, vous avez besoin d'un code plus complexe que celui qui figure dans l'exemple de ce didacticiel.

Revenir aux didacticiels de Service Broker

Didacticiels de Service Broker