Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Managed Instance
I den här lektionen lär du dig att skapa en lagrad procedur för att bearbeta meddelanden från en Service Broker-kö. Du får också lära dig hur du anger att proceduren ska aktiveras när som helst det finns meddelanden i kön.
Procedurer
Not
Kodexemplen i den här artikeln har testats med hjälp av AdventureWorks2025 exempeldatabas som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.
Växla till AdventureWorks-databasen
Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att växla kontext till AdventureWorks2025 databasen.
USE AdventureWorks2022;
GO
Skapa en intern lagrad procedur för aktivering
Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att skapa en lagrad procedur. När den körs fortsätter den lagrade proceduren att ta emot meddelanden så länge det finns meddelanden i kön. Om tidsgränsen för mottagningen uppnås utan att ett meddelande returneras avslutas den lagrade proceduren. Om det mottagna meddelandet var ett begärandemeddelande returnerar den lagrade proceduren ett svarsmeddelande. Om det mottagna meddelandet är en EndDialog-meddelande avslutar den lagrade proceduren den mottagande sidan av konversationen. Om det mottagna meddelandet är ett Error-meddelande, återställs transaktionen.
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
Ändra målkön för att specificera intern aktivering
Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att ange att Service Broker aktiverar den lagrade proceduren TargetActiveProc för att bearbeta meddelanden från TargetQueueIntAct. Service Broker kör en kopia av TargetActiveProc när ett meddelande tas emot i TargetQueueIntAct och ingen kopia av proceduren körs redan. Service Broker kör extra kopior av TargetActiveProc när de befintliga kopiorna inte hänger med i antalet inkommande meddelanden.
ALTER QUEUE TargetQueueIntAct
WITH ACTIVATION (STATUS = ON, PROCEDURE_NAME = TargetActiveProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF);
GO
Nästa steg
Du har konfigurerat AdventureWorks2025 för att stödja en konversation mellan AWDB/InternalAct/InitiatorService och AWDB/InternalAct/TargetService.