Udostępnij za pośrednictwem


Lekcja 2. Rozpoczynanie konwersacji i przesyłanie wiadomości

Dotyczy:programu SQL ServerAzure SQL Managed Instance

W tej lekcji dowiesz się, jak rozpocząć konwersację, ukończyć prosty cykl wiadomości z odpowiedzią na żądanie, a następnie zakończyć konwersację.

Procedury

Notatka

Przykłady kodu w tym artykule zostały przetestowane przy użyciu przykładowej bazy danych AdventureWorks2022, którą można pobrać ze strony głównej Przykłady programu Microsoft SQL Server i projekty społeczności.

Przełącz się do bazy danych AdventureWorks2008R2

  • Skopiuj i wklej następujący kod w oknie Edytor zapytań. Następnie uruchom go, aby przełączyć kontekst do bazy danych AdventureWorks2008R2.

        USE AdventureWorks2008R2;
        GO
    

Rozpocznij rozmowę i wyślij wiadomość z prośbą

  • Skopiuj i wklej następujący kod w oknie Edytor zapytań. Następnie uruchom ją, aby rozpocząć konwersację i wysłać komunikat żądania do //AWDB/1DBSample/TargetService. Kod musi być uruchamiany w jednym bloku, ponieważ zmienna jest używana do przekazywania uchwytu okna dialogowego z BEGIN DIALOG do instrukcji SEND. Partia uruchamia instrukcję BEGIN DIALOG, aby rozpocząć konwersację. Tworzy komunikat żądania, a następnie używa dojścia okna dialogowego w instrukcji SEND, aby wysłać komunikat żądania w tej konwersacji. Ostatnia instrukcja SELECT wyświetla tekst wysłanej wiadomości.

        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
    

Odbieranie żądania i wysyłanie odpowiedzi

  • Skopiuj i wklej następujący kod w oknie Edytor zapytań. Następnie uruchom go, aby odebrać wiadomość odpowiedzi z TargetQueue1DB i wysłać wiadomość odpowiedzi z powrotem do inicjatora. Instrukcja RECEIVE pobiera komunikat żądania. Poniższa instrukcja SELECT wyświetla tekst, aby sprawdzić, czy jest to ten sam komunikat wysłany w ostatnim kroku. Instrukcja IF sprawdza, czy odebrany komunikat jest typem komunikatu żądania, a jeśli instrukcja SEND jest używana do wysyłania komunikatu odpowiedzi z powrotem do inicjatora. Instrukcja END CONVERSATION służy do zakończenia strony docelowej konwersacji. Końcowa instrukcja SELECT wyświetla tekst wiadomości odpowiedzi.

        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
    

Odbierz odpowiedź i zakończ konwersację

  • Skopiuj i wklej następujący kod w oknie Edytor zapytań. Następnie uruchom go, aby otrzymać wiadomość odpowiedzi i zakończyć konwersację. Instrukcja RECEIVE pobiera komunikat odpowiedzi z InitiatorQueue1DB. Instrukcja END CONVERSATION kończy stronę inicjatora konwersacji. Ostatnia instrukcja SELECT wyświetla tekst wiadomości odpowiedzi, aby potwierdzić, że jest ona taka sama jak ta, która została wysłana w poprzednim kroku.

        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
    

Następne kroki

Pomyślnie ukończono cykl komunikatu typu żądanie-odpowiedź między usługą inicjującą //AWDB/1DBSample/InitiatorService a usługą docelową //AWDB/1DBSample/TargetService. Kroki opisane w tej lekcji można powtórzyć wielokrotnie, gdy chcesz przesłać parę komunikatów z odpowiedzią na żądanie. Po zakończeniu analizowania instrukcji SEND i REPLY możesz usunąć wszystkie obiekty, które zostały użyte w konwersacji. Aby uzyskać więcej informacji, zobacz Lekcja 3: Upuszczanie obiektów konwersacji.

Zobacz też