Share via


Lezione 4: Avvio di una conversazione e trasmissione di messaggi

Data creazione: 15 settembre 2007

In questa lezione verranno illustrate le procedure per avviare una conversazione tra due database appartenenti alla stessa istanza di Motore di database. Saranno inoltre illustrate le procedure per completare un ciclo semplice di messaggi di richiesta-risposta e terminare la conversazione.

Procedure

Passare al database InitiatorDB

  1. Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per cambiare contesto passando al database InitiatorDB in cui sarà inizializzata la conversazione.

    USE InitiatorDB;
    GO
    

Avviare una conversazione e inviare un messaggio di richiesta

  1. 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 //TgtDB/2DBSample/TargetService nel database TargetDB. È 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 e creare un messaggio di richiesta. Il messaggio di richiesta viene quindi 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 [//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

  1. Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per cambiare contesto al database TargetDB in cui verrà ricevuto il messaggio di richiesta e inviato un messaggio di risposta al database InitiatorDB.

    USE TargetDB;
    GO
    

Ricevere la richiesta e inviare una risposta

  1. 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 nel passaggio precedente. 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. Verifica inoltre se è utilizzata l'istruzione END CONVERSATION 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 TargetQueue2DB;
    
    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
    

Passare al database InitiatorDB

  1. Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per ripristinare il contesto al database InitiatorDB in cui verrà ricevuto il messaggio di risposta e terminata la conversazione.

    USE InitiatorDB;
    GO
    

Ricevere la risposta e terminare la conversazione

  1. 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 InitiatorQueue2DB;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Passaggi successivi

Questa lezione conclude l'esercitazione. Le esercitazioni forniscono brevi panoramiche e non illustrano tutte le opzioni disponibili. Sono caratterizzate da logica e gestione degli errori semplificate per concentrarsi meglio sulle operazioni fondamentali. Per creare solide conversazioni, efficienti e affidabili, è necessario un codice più complesso dell'esempio di questa esercitazione.

Tornare alle esercitazioni di Service Broker

Esercitazioni su Service Broker

Vedere anche

Altre risorse

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
SEND (Transact-SQL)
WAITFOR (Transact-SQL)
Service Broker Programming Basics

Guida in linea e informazioni

Assistenza su SQL Server 2005