Lezione 2: Inizio di una conversazione e trasmissione di messaggi
In questa lezione verranno descritte le procedure per avviare una conversazione, completare un semplice ciclo di messaggi richiesta-risposta e quindi terminare la conversazione.
Procedure
Passaggio al database AdventureWorks
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database AdventureWorks.
USE AdventureWorks; GO
Inizio di una conversazione e invio di un messaggio di richiesta
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per avviare una conversazione e inviare un messaggio di richiesta a //AWDB/1DBSample/TargetService. Il codice deve essere eseguito in un blocco, in quanto viene utilizzata una variabile per passare un handle di dialogo dall'istruzione BEGIN DIALOG all'istruzione SEND. Il batch esegue l'istruzione BEGIN DIALOG per avviare la conversazione. Il batch crea un messaggio di richiesta, quindi utilizza l'handle di dialogo in un'istruzione SEND per inviare il messaggio di richiesta sulla conversazione. 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
Ricezione della richiesta e invio di una risposta
Copiare e incollare il codice seguente in una 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 successiva istruzione SELECT visualizza il testo per consentire di verificare che si tratti dello stesso messaggio inviato nell'ultimo passaggio. L'istruzione IF verifica se il messaggio ricevuto è un messaggio di richiesta e se viene utilizzata un'istruzione SEND per inviare un messaggio di risposta all'initiator. L'istruzione END CONVERSATION viene utilizzata per terminare la conversazione nel lato destinazione. L'istruzione SELECT finale visualizza 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
Ricezione della risposta e fine della conversazione
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice 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 initiator della conversazione. L'ultima istruzione SELECT visualizza il testo del messaggio di risposta per consentire di verificare che si tratti dello stesso messaggio 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 messaggi richiesta-risposta tra //AWDB/1DBSample/InitiatorService e //AWDB/1DBSample/TargetService. È possibile ripetere i passaggi di questa lezione tutte le volte che lo si desidera per trasmettere una coppia di messaggi richiesta-risposta. Dopo avere controllato le 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