Lektion 2: Skapa en intern aktiveringsprocedur

gäller för:SQL ServerAzure 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.