Partager via


Leçon 2 : création d'une procédure d'activation interne

Dans cette leçon, vous allez apprendre à créer une procédure stockée pour traiter les messages d'une file d'attente Service Broker. Vous apprendrez également comment spécifier que la procédure doit être activée dès que des messages sont présents dans la file d'attente.

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
    

Créer une procédure stockée d'activation interne

  • Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête, puis exécutez-le pour créer une procédure stockée. Lorsqu'elle s'exécute, cette procédure stockée continue de recevoir des messages tant que la file d'attente en contient. Si la réception expire sans retourner aucun message, la procédure stockée se termine. Si le message reçu est un message de demande, la procédure stockée retourne un message de réponse. Si le message reçu est un message EndDialog, la procédure stockée termine la conversation côté cible. Si le message reçu est un message Error, elle restaure la transaction.

    CREATE PROCEDURE TargetActivProc
    AS
      DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
      DECLARE @RecvReqMsg NVARCHAR(100);
      DECLARE @RecvReqMsgName sysname;
    
      WHILE (1=1)
      BEGIN
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReqDlgHandle = conversation_handle,
            @RecvReqMsg = message_body,
            @RecvReqMsgName = message_type_name
          FROM TargetQueueIntAct
        ), TIMEOUT 5000;
    
        IF (@@ROWCOUNT = 0)
        BEGIN
          ROLLBACK TRANSACTION;
          BREAK;
        END
    
        IF @RecvReqMsgName =
           N'//AWDB/InternalAct/RequestMessage'
        BEGIN
           DECLARE @ReplyMsg NVARCHAR(100);
           SELECT @ReplyMsg =
           N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
           SEND ON CONVERSATION @RecvReqDlgHandle
                  MESSAGE TYPE 
                  [//AWDB/InternalAct/ReplyMessage]
                  (@ReplyMsg);
        END
        ELSE IF @RecvReqMsgName =
            N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
        BEGIN
           END CONVERSATION @RecvReqDlgHandle;
        END
        ELSE IF @RecvReqMsgName =
            N'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
        BEGIN
           END CONVERSATION @RecvReqDlgHandle;
        END
    
        COMMIT TRANSACTION;
    
      END
    GO
    

Modifier la file d'attente cible pour spécifier l'activation interne

  • Copiez et collez le code suivant dans une fenêtre de l'éditeur de requête, puis exécutez-le pour spécifier que Service Broker active la procédure stockée TargetActiveProc pour traiter des messages de TargetQueueIntAct. Service Broker exécute une copie de TargetActiveProc chaque fois qu'un message est reçu dans TargetQueueIntAct et qu'aucune copie de la procédure n'est déjà en cours d'exécution. Service Broker exécute des copies supplémentaires de TargetActiveProc chaque fois que les copies existantes ne suivent pas le nombre de messages entrants.

    ALTER QUEUE TargetQueueIntAct
        WITH ACTIVATION
        ( STATUS = ON,
          PROCEDURE_NAME = TargetActivProc,
          MAX_QUEUE_READERS = 10,
          EXECUTE AS SELF
        );
    GO
    

Étapes suivantes

Vous venez de configurer AdventureWorks2008R2 pour prendre en charge une conversation entre //AWDB/InternalAct/InitiatorService et //AWDB/InternalAct/TargetService. Vous allez par la suite achever une conversation à l'aide de cette configuration. Consultez Leçon 3 : lancement d'une conversation et transmission de messages.