Lezione 2: Inizio di una conversazione e trasmissione di messaggi
Si applica a:SQL ServerIstanza gestita di SQL di Azure
In questa lezione si apprenderà come avviare una conversazione, completare un semplice ciclo di messaggi di richiesta-risposta e quindi terminare la conversazione.
Procedure
Nota
Gli esempi sono stati convalidati in SQL Server 2008 R2 (10.50.x). Per completare gli esempi, è consigliabile usare il database di esempio AdventureWorks2008R2
dai database di esempio AdventureWorks.
SQL Server Service Broker è supportato nella versione corrente di SQL Server.
Passare al database AdventureWorks2008R2
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguirlo quindi per cambiare contesto passando al database AdventureWorks2008R2.
USE AdventureWorks2008R2; GO
Avviare una conversazione e inviare un messaggio di richiesta
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguirlo quindi per avviare una conversazione e inviare un messaggio di richiesta ad //AWDB/1DBSample/TargetService. Il codice deve essere eseguito in un blocco, perché viene usata una variabile per cambiare l'handle di dialogo dall'istruzione BEGIN DIALOG a SEND. Il batch esegue l'istruzione BEGIN DIALOG per avviare la conversazione. Crea un messaggio di richiesta e quindi usa l'handle di dialogo in un'istruzione SEND per inviare il messaggio di richiesta nella conversazione. L'ultima istruzione SELECT mostra soltanto il testo del messaggio inviato.
DECLARE @InitDlgHandle UNIQUEIDENTIFIER; DECLARE @RequestMsg NVARCHAR(100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//AWDB/1DBSample/InitiatorService] TO SERVICE N'//AWDB/1DBSample/TargetService' ON CONTRACT [//AWDB/1DBSample/SampleContract] WITH ENCRYPTION = OFF; SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//AWDB/1DBSample/RequestMessage] (@RequestMsg); SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
Ricevere la richiesta e inviare una riposta
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguire quindi il codice per ricevere il messaggio di risposta da TargetQueue1DB e inviare un messaggio di risposta all'initiator. L'istruzione RECEIVE recupera il messaggio di richiesta. La seguente istruzione SELECT mostra il testo, in modo da poter verificare che sia lo stesso messaggio inviato nell'ultimo passaggio. L'istruzione IF verifica se il messaggio ricevuto è un tipo di messaggio di richiesta e se viene usata un'istruzione SEND per inviare un messaggio di risposta all'iniziatore. L'istruzione END CONVERSATION è usata per terminare il lato di destinazione della conversazione. L'ultima istruzione SELECT mostra il testo del messaggio di risposta.
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue1DB ), TIMEOUT 1000; SELECT @RecvReqMsg AS ReceivedRequestMsg; IF @RecvReqMsgName = N'//AWDB/1DBSample/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//AWDB/1DBSample/ReplyMessage] (@ReplyMsg); END CONVERSATION @RecvReqDlgHandle; END SELECT @ReplyMsg AS SentReplyMsg; COMMIT TRANSACTION; GO
Ricevere la risposta e chiudere la conversazione
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Quindi, eseguirlo per ricevere il messaggio di risposta e terminare la conversazione. L'istruzione RECEIVE recupera il messaggio di risposta da InitiatorQueue1DB. L'istruzione END CONVERSATION termina il lato iniziatore della conversazione. 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 NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue1DB ), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Passaggi successivi
È stato completato correttamente un ciclo di messaggio di richiesta-risposta tra //AWDB/1DBSample/InitiatorService e //AWDB/1DBSample/TargetService. È possibile ripetere i passaggi di questa lezione e trasmettere una coppia di messaggi di richiesta-risposta quante volte si desidera. Dopo aver approfondito le istruzioni SEND e REPLY, è possibile eliminare tutti gli oggetti usati dalla conversazione. Per altre informazioni, vedere Lezione 3: Eliminazione degli oggetti di conversazione.
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per