Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Istanza 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.