Condividi tramite


Lezione 2: Inizio di una conversazione e trasmissione di messaggi

In questa lezione verranno descritte le procedure per avviare una conversazione, completare un semplice ciclo di messaggi richiesta-risposta e quindi terminare la conversazione.

Procedure

Passaggio al database AdventureWorks

  • Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database AdventureWorks.

    USE AdventureWorks;
    GO
    

Inizio 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 //AWDB/1DBSample/TargetService. 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 avviare la conversazione. Il batch crea un messaggio di richiesta, quindi utilizza 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
          [//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
    

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 TargetQueue1DB e inviare un messaggio di risposta all'initiator. L'istruzione RECEIVE recupera il messaggio di richiesta. La successiva istruzione SELECT visualizza il testo per consentire di verificare che si tratti dello stesso messaggio inviato nell'ultimo passaggio. 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 END CONVERSATION viene utilizzata per terminare la conversazione nel lato destinazione. 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 TargetQueue1DB
    ), TIMEOUT 1000;
    
    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
    

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 InitiatorQueue1DB. 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 InitiatorQueue1DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Passaggi successivi

È stato completato correttamente un ciclo di messaggi richiesta-risposta tra //AWDB/1DBSample/InitiatorService e //AWDB/1DBSample/TargetService. È possibile ripetere i passaggi di questa lezione tutte le volte che lo si desidera per trasmettere una coppia di messaggi richiesta-risposta. Dopo avere controllato le istruzioni SEND e REPLY, è possibile eliminare tutti gli oggetti utilizzati dalla conversazione. Per ulteriori informazioni, vedere Lezione 3: Eliminazione degli oggetti di conversazione.