Lezione 3: Iniziare una conversazione e trasmettere messaggi

Si applica a:SQL ServerIstanza gestita di SQL di Azure

In questa lezione imparerai a completare un ciclo di messaggi richiesta-risposta di base in un sistema configurato con una procedura memorizzata di attivazione interna.

Procedure

Passare al database AdventureWorks

Nota

Gli esempi di codice in questo articolo sono stati testati usando il database di esempio AdventureWorks2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.

Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per passare al contesto del AdventureWorks2025 database.

USE AdventureWorks2022;
GO

Avviare una conversazione e inviare un messaggio di richiesta

Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per avviare una conversazione e inviare un messaggio di richiesta a AWDB/InternalAct/TargetService. Il codice deve essere eseguito in un solo blocco, perché viene usata una variabile per passare un handle di dialogo da BEGIN DIALOG all'istruzione SEND . Il batch esegue l'istruzione BEGIN DIALOG per avviare la conversazione. Costruisce un messaggio di richiesta, quindi utilizza l'handle di dialogo in un'istruzione SEND per inviare il messaggio di richiesta su quella conversazione. L'ultima istruzione SELECT visualizza il testo del messaggio inviato.

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

Ricevere la richiesta e inviare una riposta

Quando si invia il messaggio di richiesta, Service Broker attiva automaticamente una copia di TargetActiveProc. La stored procedure riceve il messaggio di risposta da TargetQueueIntAct e invia un messaggio di risposta all'iniziatore.

Ricevere la risposta e chiudere la conversazione

Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Quindi, eseguilo per ricevere il messaggio di risposta e terminare la conversazione. L'istruzione RECEIVE recupera il messaggio di risposta da InitiatorQueueIntAct. L'istruzione END CONVERSATION termina il lato iniziatore della conversazione e invia un messaggio EndDialog al servizio di destinazione. L'ultima istruzione SELECT visualizza il testo del messaggio di risposta in modo da poter confermare che è uguale a quello inviato nel passaggio precedente.

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

Termina la parte del destinatario della conversazione

Quando si esegue l'istruzione END CONVERSATION per l'iniziatore, Service Broker invia un messaggio EndDialog alla coda TargetQueueIntAct. La procedura TargetActiveProc riceve il messaggio EndDialog e genera un oggetto END CONVERSATION che termina il lato di destinazione della conversazione.

Passaggio successivo

È stato completato correttamente un ciclo di messaggi di richiesta-risposta tra AWDB/InternalAct/InitiatorService e AWDB/InternalAct/TargetService. È possibile ripetere i passaggi di questa lezione e trasmettere una coppia di messaggi di richiesta-risposta quante volte si desidera. Al termine dell'analisi delle istruzioni SEND e REPLY, è possibile eliminare tutti gli oggetti usati dalla conversazione.