Delen via


Les 2: Een interne activeringsprocedure maken

van toepassing op:SQL ServerAzure SQL Managed Instance

In deze les leert u hoe u een opgeslagen procedure maakt voor het verwerken van berichten uit een Service Broker-wachtrij. U leert ook hoe u kunt opgeven dat de procedure wordt geactiveerd wanneer er berichten in de wachtrij staan.

Procedures

Notitie

De codevoorbeelden in dit artikel zijn getest met behulp van de AdventureWorks2022 voorbeelddatabase, die u kunt downloaden van de Microsoft SQL Server-voorbeelden en communityprojecten startpagina.

Overschakelen naar de AdventureWorks-database

Kopieer en plak de volgende code in een queryeditorvenster. Voer deze vervolgens uit om de context over te schakelen naar de AdventureWorks2022-database.

USE AdventureWorks2022;
GO

Een opgeslagen procedure voor interne activering maken

Kopieer en plak de volgende code in een queryeditorvenster. Voer deze vervolgens uit om een opgeslagen procedure te maken. Wanneer deze wordt uitgevoerd, blijft de opgeslagen procedure berichten ontvangen zolang er berichten in de wachtrij staan. Als er een time-out optreedt tijdens het ontvangen van een bericht, en er wordt geen bericht teruggegeven, wordt de opgeslagen procedure beëindigd. Als het ontvangen bericht een aanvraagbericht was, retourneert de opgeslagen procedure een antwoordbericht. Als het ontvangen bericht een EndDialog bericht is, beëindigt de opgeslagen procedure de doelzijde van het gesprek. Als het ontvangen bericht een Error-bericht is, wordt de transactie teruggezet.

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

De doelwachtrij wijzigen om interne activering op te geven

Kopieer en plak de volgende code in een queryeditorvenster. Voer het vervolgens uit om aan te geven dat Service Broker de opgeslagen procedure TargetActiveProc activeert om berichten van TargetQueueIntActte verwerken. Service Broker voert een kopie uit van TargetActiveProc telkens wanneer een bericht wordt ontvangen in TargetQueueIntAct en er is geen kopie van de procedure die al wordt uitgevoerd. Service Broker voert extra kopieën van TargetActiveProc uit wanneer de bestaande kopieën het aantal binnenkomende berichten niet bijhouden.

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

Volgende stap

U hebt AdventureWorks2022 geconfigureerd om een gesprek tussen de //AWDB/InternalAct/InitiatorService en de //AWDB/InternalAct/TargetServicete ondersteunen.