Les 2: Een interne activeringsprocedure maken
van toepassing op:SQL Server
Azure 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 TargetQueueIntAct
te 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/TargetService
te ondersteunen.