Partager via


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

Nouveau : 15 septembre 2007

Dans cette leçon, vous allez apprendre à démarrer une conversation entre deux bases de données placées dans la même instance du Moteur de base de données. Vous apprendrez également comment réaliser un cycle de messages simple de type demande-réponse, puis comment terminer la conversation.

Procédures

Basculer vers la base de données InitiatorDB

  1. Copiez et collez le code suivant dans une fenêtre d'éditeur de requête, puis exécutez-le de manière à basculer le contexte vers la base de données InitiatorDB sur laquelle vous allez lancer la conversation.

    USE InitiatorDB;
    GO
    

Démarrer une conversation et envoyer un message de demande

  1. Copiez et collez le code suivant dans une fenêtre d'éditeur de requête, puis exécutez-le de manière à démarrer une conversation et à envoyer un message de demande au service //TgtDB/2DBSample/TargetService dans la base de données TargetDB. Le code doit être exécuté dans un 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, puis génère un message de demande. Il utilise ensuite 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 qui a été 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

  1. Copiez et collez le code suivant dans une fenêtre d'éditeur de requête, puis exécutez-le de manière à basculer le contexte vers la base de données TargetDB sur laquelle vous recevrez le message de demande et renverrez un message de réponse à la base de données InitiatorDB.

    USE TargetDB;
    GO
    

Recevoir la demande et envoyer une réponse

  1. Copiez et collez le code suivant dans une fenêtre d'éditeur de requête, puis exécutez-le de manière à recevoir le message de réponse de la file d'attente TargetQueue2DB et à renvoyer un message de réponse à l'initiateur. L'instruction RECEIVE récupère le message de demande. L'instruction SELECT qui suit affiche le texte afin que vous puissiez vérifier qu'il s'agit bien du message qui a été 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 renvoyer un message de réponse à l'initiateur. Elle teste également si l'instruction END CONVERSATION est utilisée pour terminer la conversation côté 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;
    
    RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
    FROM TargetQueue2DB;
    
    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

  1. Copiez et collez le code suivant dans une fenêtre d'éditeur de requête, puis exécutez-le de manière à revenir au contexte de la base de données InitiatorDB sur laquelle vous recevrez le message de réponse et terminerez la conversation.

    USE InitiatorDB;
    GO
    

Recevoir la réponse et terminer la conversation

  1. Copiez et collez le code suivant dans une fenêtre d'éditeur de requête, puis exécutez-le de manière à recevoir le message de réponse et à terminer la conversation. L'instruction RECEIVE récupère le message de réponse dans la file d'attente InitiatorQueue2DB. L'instruction END CONVERSATION termine la conversation côté initiateur. La dernière instruction SELECT affiche le texte du message de réponse afin que vous puissiez confirmer qu'il est identique à celui qui a été envoyé lors de l'étape précédente.

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueue2DB;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Étapes suivantes

Ce didacticiel est maintenant terminé. Les didacticiels sont des vues d'ensemble et ne décrivent pas toutes les options disponibles. Ils se concentrent sur les opérations fondamentales. Pour créer des conversations efficaces, fiables et robustes, vous avez besoin de code plus complexe que l'exemple proposé dans ce didacticiel.

Revenir aux didacticiels de Service Broker

Didacticiels de Service Broker

Voir aussi

Autres ressources

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
SEND (Transact-SQL)
WAITFOR (Transact-SQL)
Service Broker Programming Basics

Aide et Informations

Assistance sur SQL Server 2005