Les 3: Een gesprek starten en berichten verzenden

van toepassing op:SQL ServerAzure SQL Managed Instance

In deze les leert u hoe u een basiscyclus voor het beantwoorden van aanvragen voltooit in een systeem dat is geconfigureerd met een interne procedure voor activering.

Procedures

Overschakelen naar de AdventureWorks-database

Notitie

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

Kopieer en plak de volgende code in een queryeditorvenster en voer deze uit om de context over te schakelen naar de AdventureWorks2025 database.

USE AdventureWorks2022;
GO

Een gesprek starten en een aanvraagbericht verzenden

Kopieer en plak de volgende code in een queryeditorvenster, voer deze uit om een gesprek te starten en een aanvraagbericht te verzenden naar de AWDB/InternalAct/TargetService. De code moet in één blok worden uitgevoerd, omdat een variabele wordt gebruikt om een dialoogvenstergreep van BEGIN DIALOG naar de SEND instructie door te geven. De batch voert de BEGIN DIALOG instructie uit om het gesprek te starten. Er wordt een aanvraagbericht gemaakt en vervolgens de dialoogvenstergreep in een SEND instructie gebruikt om het aanvraagbericht in dat gesprek te verzenden. In de laatste SELECT instructie wordt de tekst weergegeven van het bericht dat is verzonden.

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

De aanvraag ontvangen en een antwoord verzenden

Wanneer u het aanvraagbericht verzendt, activeert Service Broker automatisch een kopie van TargetActiveProc. De opgeslagen procedure ontvangt het antwoordbericht van TargetQueueIntAct en stuurt een antwoordbericht terug naar de initiator.

Het antwoord ontvangen en het gesprek beëindigen

Kopieer en plak de volgende code in een queryeditorvenster. Voer het vervolgens uit om het antwoordbericht te ontvangen en het gesprek te beëindigen. Met RECEIVE de instructie wordt het antwoordbericht opgehaald uit initiatorQueueIntAct. De END CONVERSATION instructie beëindigt de initiatorzijde van het gesprek en verzendt een EndDialog-bericht naar de doelservice. In de laatste SELECT instructie wordt de tekst van het antwoordbericht weergegeven, zodat u kunt bevestigen dat het hetzelfde is als wat in de vorige stap is verzonden.

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

Beëindig het doelgedeelte van het gesprek

Wanneer u de END CONVERSATION instructie voor de initiator uitvoert, verzendt Service Broker een EndDialog-bericht naar de TargetQueueIntAct-wachtrij . De TargetActiveProc-procedure ontvangt het EndDialog-bericht en geeft een END CONVERSATION bericht uit waarmee de doelzijde van het gesprek wordt beëindigd.

Volgende stap

U hebt een aanvraag-antwoordcyclus voltooid tussen de AWDB/InternalAct/InitiatorService en de AWDB/InternalAct/TargetService. U kunt de stappen in deze les zo vaak herhalen als u een aanvraag-antwoordpaar met berichten wilt verzenden. Wanneer u klaar bent met het onderzoeken van de instructies VERZENDEN en BEANTWOORDEN, kunt u alle objecten verwijderen die door het gesprek zijn gebruikt.