Condividi tramite


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.

Come tornare alle esercitazioni di Service Broker

Esercitazioni di Service Broker