Lektion 3: Starta en konversation och skicka meddelanden

gäller för:SQL ServerAzure SQL Managed Instance

I den här lektionen lär du dig att slutföra en grundläggande meddelandecykel för begäran och svar i ett system som konfigurerats med en intern aktiverings lagrad procedur.

Procedurer

Växla till AdventureWorks-databasen

Anteckning

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.

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

Starta en konversation och skicka ett meddelande om begäran

Kopiera och klistra in följande kod i ett frågeredigerarefönster, kör den sedan för att starta en konversation och skicka ett begärandemeddelande till AWDB/InternalAct/TargetService. Koden måste köras i ett block eftersom en variabel används för att skicka ett dialoghandtag från BEGIN DIALOG till -instruktionen SEND . Batch kör BEGIN DIALOG-instruktionen för att starta konversationen. Det skapar ett begärandemeddelande och använder sedan dialoghandtaget i en SEND -instruktion för att skicka begärandemeddelandet i konversationen. Den sista SELECT-instruktionen visar texten i meddelandet som skickades.

DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER;
DECLARE @RequestMsg AS NVARCHAR (100);

BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
    FROM SERVICE [//AWDB/InternalAct/InitiatorService]
    TO SERVICE N'//AWDB/InternalAct/TargetService'
    ON CONTRACT [//AWDB/InternalAct/SampleContract]
    WITH ENCRYPTION = OFF;

-- Send a message on the conversation
SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';

SEND ON CONVERSATION (@InitDlgHandle)
    MESSAGE TYPE [//AWDB/InternalAct/RequestMessage] (@RequestMsg);

-- Display sent request.
SELECT @RequestMsg AS SentRequestMsg;

COMMIT TRANSACTION;
GO

Ta emot begäran och skicka ett svar

När du skickar begärandemeddelandet aktiverar Service Broker automatiskt en kopia av TargetActiveProc. Den lagrade proceduren tar emot svarsmeddelandet från TargetQueueIntAct och skickar ett svarsmeddelande tillbaka till initieraren.

Ta emot svaret och avsluta konversationen

Kopiera och klistra in följande kod i ett frågeredigerarefönster. Kör den sedan för att ta emot svarsmeddelandet och avsluta konversationen. -instruktionen RECEIVE hämtar svarsmeddelandet från InitiatorQueueIntAct. Instruktionen END CONVERSATION avslutar initierarsidan av konversationen och skickar ett EndDialog-meddelande till måltjänsten. Den sista SELECT-instruktionen visar texten i svarsmeddelandet så att du kan bekräfta att det är samma som det som skickades i föregående steg.

DECLARE @RecvReplyMsg AS NVARCHAR (100);
DECLARE @RecvReplyDlgHandle AS UNIQUEIDENTIFIER;

BEGIN TRANSACTION;

WAITFOR (RECEIVE TOP (1) @RecvReplyDlgHandle = conversation_handle,
    @RecvReplyMsg = message_body FROM InitiatorQueueIntAct),
TIMEOUT 5000;

END CONVERSATION @RecvReplyDlgHandle;

-- Display received request.
SELECT @RecvReplyMsg AS ReceivedReplyMsg;

COMMIT TRANSACTION;
GO

Avsluta målsidan för konversationen

När du kör END CONVERSATION-instruktionen för initiativtagaren skickar Service Broker ett EndDialog-meddelande till kön TargetQueueIntAct. TargetActiveProc-proceduren tar emot EndDialog-meddelandet och utfärdar en END CONVERSATION som avslutar målsidan av konversationen.

Nästa steg

Du har slutfört en begäran/svar-meddelandecykel mellan AWDB/InternalAct/InitiatorService och AWDB/InternalAct/TargetService. Du kan upprepa stegen i den här lektionen så många gånger som du vill överföra ett par meddelanden med begärandesvar. När du är klar med att undersöka SEND- och REPLY-uttrycken kan du släppa alla objekt som användes av konversationen.