Condividi tramite


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

  1. 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

  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 //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

  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 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

  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 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

Guida in linea e informazioni

Assistenza su SQL Server 2005