Lezione 4: Inizio di una conversazione e trasmissione di messaggi
In questa lezione verranno descritte le procedure per avviare una conversazione tra due database nella stessa istanza di Motore di database e per completare un semplice ciclo di messaggi richiesta-risposta e quindi terminare la conversazione.
Procedure
Passaggio al database InitiatorDB
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database InitiatorDB in cui verrà avviata la conversazione.
USE InitiatorDB; GO
Avvio 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 //TgtDB/2DBSample/TargetService nel database TargetDB. 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 iniziare la conversazione e creare un messaggio di richiesta. Il batch utilizza quindi 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 [//InitDB/2DBSample/InitiatorService] TO SERVICE N'//TgtDB/2DBSample/TargetService' ON CONTRACT [//BothDB/2DBSample/SimpleContract] WITH ENCRYPTION = OFF; SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//BothDB/2DBSample/RequestMessage] (@RequestMsg); SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
Passaggio al database TargetDB
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database TargetDB in cui si riceverà il messaggio di richiesta e inviare un messaggio di risposta a InitiatorDB.
USE TargetDB; 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 TargetQueue2DB e inviare un messaggio di risposta all'initiator. L'istruzione RECEIVE recupera il messaggio di richiesta. La successiva istruzione SELECT visualizza il testo del messaggio per consentire di verificare che si tratti dello stesso messaggio inviato nel passaggio precedente. 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 verifica inoltre se viene utilizzata l'istruzione END CONVERSATION per terminare il lato destinazione della conversazione. 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 TargetQueue2DB ), TIMEOUT 1000; SELECT @RecvReqMsg AS ReceivedRequestMsg; IF @RecvReqMsgName = N'//BothDB/2DBSample/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg); END CONVERSATION @RecvReqDlgHandle; END SELECT @ReplyMsg AS SentReplyMsg; COMMIT TRANSACTION; GO
Passaggio al database InitiatorDB
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database InitiatorDB in cui si riceverà il messaggio di risposta e terminare la conversazione.
USE InitiatorDB; 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 InitiatorQueue2DB. 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 InitiatorQueue2DB ), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Passaggi successivi
In questo modo si conclude l'esercitazione. Le esercitazioni forniscono brevi introduzioni e non illustrano tutte le opzioni disponibili. Le esercitazioni utilizzano logica e gestione degli errori semplificate e non devono essere utilizzate in un ambiente di produzione.Per creare conversazioni efficaci, affidabili ed efficienti, è necessario utilizzare codice più complesso rispetto a quello utilizzato nell'esempio dell'esercitazione.