Delen via


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 AdventureWorks2022 voorbeelddatabase, die u kunt downloaden van de Microsoft SQL Server-voorbeelden en communityprojecten startpagina.

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 gesprek starten en een aanvraagbericht verzenden

Kopieer en plak de volgende code in een queryeditorvenster. Voer het vervolgens uit om een gesprek te starten en een aanvraagbericht naar de //AWDB/InternalAct/TargetServicete verzenden. De code moet in één blok worden uitgevoerd omdat een variabele wordt gebruikt om een dialoogvenstergreep van BEGIN DIALOG door te geven aan de SEND-instructie. De batch voert de BEGIN DIALOG instructie uit om het gesprek te starten. Er wordt een aanvraagbericht gemaakt en vervolgens wordt de dialooghandgreep in een SEND instructie gebruikt om het aanvraagbericht tijdens 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 de 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. De RECEIVE-instructie haalt het antwoordbericht op uit de InitiatorQueueIntAct. De END CONVERSATION-instructie beëindigt de initiatorzijde van het gesprek en stuurt 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 uit die het gesprek aan de doelzijde beëindigt.

Volgende stap

U hebt een aanvraag-antwoordcyclus tussen de //AWDB/InternalAct/InitiatorService en de //AWDB/InternalAct/TargetServicevoltooid. 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 SEND- en REPLY-instructies, kunt u alle objecten verwijderen die door het gesprek zijn gebruikt.