Les 3: Een gesprek starten en berichten verzenden
van toepassing op:SQL Server
Azure 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/TargetService
te 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/TargetService
voltooid. 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.