Udostępnij za pośrednictwem


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

Dotyczy:programu SQL ServerAzure SQL Managed Instance

W tej lekcji nauczysz się ukończyć podstawowy cykl wiadomości żądanie-odpowiedź w systemie skonfigurowanym przy użyciu wewnętrznej procedury składowanej aktywacji.

Procedury

Przełącz się do bazy danych AdventureWorks

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.

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

USE AdventureWorks2022;
GO

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

Skopiuj i wklej następujący kod w oknie Edytor zapytań. Następnie uruchom go, aby rozpocząć konwersację i wysłać wiadomość żądania do //AWDB/InternalAct/TargetService. Kod musi być uruchamiany w jednym bloku, ponieważ zmienna jest używana do przekazywania dojścia okna dialogowego z BEGIN DIALOG do instrukcji SEND. Zadanie uruchamia instrukcję BEGIN DIALOG, aby rozpocząć rozmowę. 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 AS UNIQUEIDENTIFIER;
DECLARE @RequestMsg AS NVARCHAR (100);

BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
    FROM SERVICE [//AWDB/InternalAct/InitiatorService]
    TO SERVICE N'//AWDB/InternalAct/TargetService'
    ON CONTRACT [//AWDB/InternalAct/SampleContract]
    WITH ENCRYPTION = OFF;

-- Send a message on the conversation
SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>';

SEND ON CONVERSATION (@InitDlgHandle)
    MESSAGE TYPE [//AWDB/InternalAct/RequestMessage] (@RequestMsg);

-- Display sent request.
SELECT @RequestMsg AS SentRequestMsg;

COMMIT TRANSACTION;
GO

Odbieranie żądania i wysyłanie odpowiedzi

Po wysłaniu komunikatu żądania usługa Service Broker automatycznie aktywuje kopię TargetActiveProc. Procedura składowana odbiera komunikat odpowiedzi z TargetQueueIntAct i wysyła wiadomość odpowiedzi z powrotem do inicjatora.

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 wiadomość odpowiedzi z InitiatorQueueIntAct. Instrukcja END CONVERSATION kończy stronę inicjatora konwersacji i wysyła komunikat EndDialog do usługi docelowej. 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 AS NVARCHAR (100);
DECLARE @RecvReplyDlgHandle AS UNIQUEIDENTIFIER;

BEGIN TRANSACTION;

WAITFOR (RECEIVE TOP (1) @RecvReplyDlgHandle = conversation_handle,
    @RecvReplyMsg = message_body FROM InitiatorQueueIntAct),
TIMEOUT 5000;

END CONVERSATION @RecvReplyDlgHandle;

-- Display received request.
SELECT @RecvReplyMsg AS ReceivedReplyMsg;

COMMIT TRANSACTION;
GO

Kończ stronę docelową konwersacji

Po wykonaniu instrukcji END CONVERSATION dla inicjatora, usługa Service Broker wysyła komunikat EndDialog do kolejki TargetQueueIntAct. Procedura TargetActiveProc odbiera wiadomość EndDialog i wysyła END CONVERSATION kończącą konwersację po stronie docelowej.

Następny krok

Pomyślnie ukończono cykl komunikatu z odpowiedzią na żądanie między //AWDB/InternalAct/InitiatorService a //AWDB/InternalAct/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 używane przez konwersację.