Lezione 2: Avvio di una conversazione e trasmissione di messaggi
Data creazione: 15 settembre 2007
In questa lezione saranno illustrate le procedure per avviare una conversazione, completare un ciclo semplice di messaggi di richiesta-risposta e terminare la conversazione.
Procedure
Passare al database AdventureWorks
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per cambiare contesto passando al database AdventureWorks.
USE AdventureWorks; 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 al servizio //AWDB/1DBSample/TargetService. È necessario eseguire il codice in un unico blocco perché viene utilizzata una variabile per passare un handle di dialogo dall'istruzione BEGIN DIALOG all'istruzione SEND. L'istruzione BEGIN DIALOG del batch viene eseguita per avviare la conversazione. Viene creato un messaggio di richiesta, a sua volta inviato tramite l'handle di dialogo in un'istruzione SEND nella conversazione in esecuzione. L'ultima istruzione SELECT visualizza 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 risposta
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per ricevere il messaggio di risposta dalla coda TargetQueue2DB e restituire un messaggio di risposta all'initiator. L'istruzione RECEIVE recupera il messaggio di richiesta, mentre la successiva istruzione SELECT visualizza il testo per consentire di verificare che si tratti del messaggio inviato nell'ultimo passaggio. L'istruzione IF verifica se il tipo di messaggio ricevuto è un messaggio di richiesta e se viene utilizzata un'istruzione SEND per restituire un messaggio di risposta all'initiator. L'istruzione END CONVERSATION è utilizzata per terminare la conversazione dal lato della destinazione. L'istruzione SELECT finale visualizza il testo del messaggio di risposta.
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; BEGIN TRANSACTION; RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue1DB; 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 terminare la conversazione
Copiare e incollare il codice seguente in una 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 dalla coda InitiatorQueue2DB. L'istruzione END CONVERSATION termina la conversazione dal lato dell'initiator. L'ultima istruzione SELECT visualizza il testo del messaggio di risposta per consentire di verificare che corrisponda al messaggio inviato nel passaggio precedente.
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue1DB; END CONVERSATION @RecvReplyDlgHandle; SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Passaggi successivi
È stato completato un ciclo di messaggi di richiesta-risposta tra //AWDB/1DBSample/InitiatorService e //AWDB/1DBSample/TargetService. È possibile trasmettere coppie di messaggi di richiesta-risposta ripetendo più volte i passaggi di questa lezione. Al termine dell'analisi delle istruzioni SEND e REPLY, è possibile eliminare tutti gli oggetti utilizzati dalla conversazione. Per ulteriori informazioni, vedere Lezione 3: Eliminazione degli oggetti di conversazione.
Vedere anche
Altre risorse
BEGIN DIALOG CONVERSATION (Transact-SQL)
SEND (Transact-SQL)
RECEIVE (Transact-SQL)
END CONVERSATION (Transact-SQL)
Service Broker Programming Basics