Lezione 4: Iniziare una conversazione e trasmettere messaggi

Si applica a:SQL ServerIstanza gestita di SQL di Azure

In questa lezione si apprenderà come avviare una conversazione che si estende su due database nella stessa istanza del motore di database. Si apprenderà anche come completare un semplice ciclo di messaggi di richiesta-risposta e quindi terminare la conversazione.

Procedure

Passare al database InitiatorDB

  • Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per passare al contesto al database InitiatorDB in cui si avvia la conversazione.

    USE InitiatorDB;
    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 TgtDB/2DBSample/TargetService in TargetDB. Il codice deve essere eseguito in un 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 e compilare un messaggio di richiesta. Usa quindi l'handle di dialogo in un'istruzione SEND per inviare il messaggio di richiesta in tale conversazione. L'ultima SELECT istruzione visualizza il testo del messaggio inviato.

    DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER;
    DECLARE @RequestMsg AS 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
    

Passare al database TargetDB

  • Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguirlo quindi per passare al contesto al TargetDB database in cui viene visualizzato il messaggio di richiesta e inviare un messaggio di risposta all'oggetto InitiatorDB.

    USE TargetDB;
    GO
    

Ricevere la richiesta e inviare una riposta

  • Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per ricevere il messaggio di risposta da TargetQueue2DB e inviare un messaggio di risposta all'iniziatore. L'istruzione RECEIVE recupera il messaggio di richiesta. L'istruzione seguente SELECT visualizza quindi il testo in modo che sia possibile verificare che sia lo stesso messaggio inviato nel passaggio precedente. 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. Verifica inoltre se l'istruzione END CONVERSATION viene usata per terminare il lato di destinazione della conversazione. L'istruzione finale SELECT visualizza il testo del messaggio di risposta.

    DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg AS NVARCHAR (100);
    DECLARE @RecvReqMsgName AS 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 AS 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
    

Passare al database InitiatorDB

  • Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguilo quindi per tornare al contesto del database InitiatorDB, dove ricevi il messaggio di risposta e concludi la conversazione.

    USE InitiatorDB;
    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 InitiatorQueue2DB. L'istruzione END CONVERSATION termina il lato iniziatore della conversazione. L'ultima SELECT istruzione 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 InitiatorQueue2DB),
    TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display received request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO