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 AdventureWorks
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 AdventureWorks.
USE AdventureWorks; 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 doit activer la procédure stockée TargetActiveProc afin de traiter les messages provenant de TargetQueueIntAct. Service Broker exécute une copie de TargetActiveProc dès qu'un message est reçu dans TargetQueueIntAct et si aucune copie de la procédure n'est en cours d'exécution. Service Broker exécute des copies supplémentaires de TargetActiveProc dès que le nombre de messages entrants est trop important pour les copies existantes.
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
Étapes suivantes
Vous venez de configurer AdventureWorks 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.
Voir aussi