Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Managed Instance
Dans cette leçon, vous allez apprendre à créer une procédure stockée pour traiter les messages à partir d’une file d’attente Service Broker. Vous apprenez également à spécifier que la procédure est activée chaque fois qu’il y a des messages dans la file d’attente.
Procédures
Remarque
Les exemples de code de cet article ont été testés à l’aide de l’exemple de base de données AdventureWorks2025, que vous pouvez télécharger à partir de la Microsoft SQL Server Samples and Community Projects page d’accueil.
Basculer vers la base de données AdventureWorks
Copiez et collez le code suivant dans une fenêtre éditeur de requête, puis exécutez-la pour basculer le contexte vers la AdventureWorks2025 base de données.
USE AdventureWorks2022;
GO
Créer une procédure stockée d'activation interne
Copiez et collez le code suivant dans une fenêtre éditeur de requête, puis exécutez-la pour créer une procédure stockée. Lorsqu’elle s’exécute, la procédure stockée continue de recevoir des messages tant qu’il y a des messages dans la file d’attente. 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 EndDialog message, la procédure stockée met fin au côté cible de la conversation. Si le message reçu est et Error message, il restaure la transaction.
CREATE PROCEDURE TargetActiveProc
AS
DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg AS NVARCHAR (100);
DECLARE @RecvReqMsgName AS 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;
BREAK;
END
IF @RecvReqMsgName = N'//AWDB/InternalAct/RequestMessage'
BEGIN
DECLARE @ReplyMsg AS 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-la pour spécifier que Service Broker active la procédure stockée TargetActiveProc pour traiter les 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 correspondent pas au nombre de messages entrants.
ALTER QUEUE TargetQueueIntAct
WITH ACTIVATION (STATUS = ON, PROCEDURE_NAME = TargetActiveProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF);
GO
Étape suivante
Vous avez correctement configuré AdventureWorks2025 pour prendre en charge une conversation entre AWDB/InternalAct/InitiatorService et AWDB/InternalAct/TargetService.