Udostępnij za pośrednictwem


Konspekt Application usługa Broker

Większość aplikacji usługa Broker wykonaj te same podstawowe kroki do odbierania i przetwarzania wiadomości:

  1. Aplikacja rozpoczyna się od transakcji.

  2. Jeśli aplikacja przechowuje stan, aplikacja pobiera grupa konwersacji identyfikator.Aplikacja używa tego identyfikatora, aby przywrócić stan z tabela stanu.Jeśli nie ma żadnych grupa konwersacji z ma wiadomości, które są gotowe do przyjęcia, aplikacja ponownie rolkach transakcji i kończy pracę.

  3. Aplikacja odbiera jeden lub więcej wiadomości z kolejki.Jeśli aplikacja ma identyfikator grupa konwersacji, aplikacja używa do odbierania wiadomości dla tej grupa konwersacji identyfikator grupa konwersacji.Jeśli więcej wiadomości nie są dostępne do przyjęcia, aplikacja zatwierdza transakcję i zwraca do kroku 1.

  4. Aplikacja sprawdza poprawność zawartości wiadomości, w zależności od nazwy typ komunikatu.

  5. Aplikacja przetwarza wiadomości, na podstawie nazwy typ komunikatu i zawartość wiadomości.

  6. Aplikacja wysyła komunikaty, które w wyniku przetworzenia.

  7. Aplikacja aplikacja przechowuje stanu, aktualizuje stan tabela przy użyciu identyfikatora grupa konwersacji jako klucz podstawowy dla tabela.

  8. Aplikacja zwraca do kroku 3, aby sprawdzić, czy dostępne są większej liczby wiadomości.

Dokładne strukturę aplikacji, zależy od wymagań aplikacji, styl komunikacji aplikacji, czy aplikacja jest Usługa miejsce docelowe lub usługą inicjujący i czy Service Broker uaktywni ją lub nie.

Na przykład aplikacja inicjujący wysyła komunikat przed rozpoczyna pętlę przetwarzania opisane w poprzednich krokach.Usługa inicjujący może wysłać wiadomość z innego programu lub procedura przechowywana, a następnie użyj procedura przechowywana aktywacja inicjujący kolejki usługi.Na przykład aplikacja wpis zamówienia może zawierać aplikacji zewnętrznej, który inicjuje komunikację do kolejności wprowadzania.Po wprowadzeniu kolejność zewnętrznej aplikacji należy pozostają uruchomione.procedura przechowywana aktywacja usługa inicjujący wysyła potwierdzenie zamówienia, jeśli zwraca odpowiedź z usługa zamówienia.procedura przechowywana aktywacja również przetwarza komunikaty o błędach usługa Broker zwracanych przez usługa miejsce docelowe i wysyła powiadomienia, że zamówienie nie może być potwierdzone.

Alternatywnie zamiast wysyłania wiadomości z innego programu, inicjujący aplikacji może wysłać wiadomość i uruchom pętli przetwarzania w ramach tego samego programu.Niezależnie od tych zmian podstawowe konspektu pozostaje bez zmian.

Aplikacja, która przetwarza dużą liczbę wiadomości w tym samym grupa konwersacji może zachować licznik komunikaty odebrane i przekazać transakcji po przetworzeniu pewną liczbę wiadomości.Strategia ta liczba i zatwierdzanie umożliwia transakcje stosunkowo krótką aplikacji i umożliwia aplikacji, proces konwersacji różnych grup.

Przykład

Poniżej Transact-SQL przykład przetwarza wszystkie wiadomości w kolejce MyServiceQueue. Przetwarzanie wiadomości jest minimalne. Jeśli wiadomość jest EndDialog or Błąd wiadomości, kod kończy się do konwersacji.Dla każdej wiadomości kod tworzy reprezentacji XML wiadomości i generuje zestaw wyników zawierający uchwyt konwersacji, nazwa typu komunikatu i kodu XML.Gdy wiadomości nie są dostępne dla 500 milisekund, kod zamyka.

Dla uproszczenia skrypt daje wynik dla każdej wiadomości.Jeśli wystąpi błąd podczas odczytu z kolejki, skrypt zatwierdza zmiany bez wytwarzania wyniki.W związku z tym ten skrypt dyskretnie usunie wszystkie wiadomości, które powodują wystąpienie błędu.

Uwaga

Ponieważ skrypt po prostu wyświetlane są komunikaty, poison wiadomości nie są możliwe do tego skryptu.W związku z tym skrypt nie zawiera kodu do obsługi wiadomości poison.Aplikacji produkcji powinny być zapisane do obsługi wiadomości poison.Aby uzyskać więcej informacji na temat poison wiadomości Zobacz Obsługa wiadomości typu poison.

USE AdventureWorks ;
GO

-- Process all conversation groups.

WHILE (1 = 1)
BEGIN

DECLARE @conversation_handle UNIQUEIDENTIFIER,
        @conversation_group_id UNIQUEIDENTIFIER,
        @message_body XML,
        @message_type_name NVARCHAR(128);


-- Begin a transaction, one per conversation group.

BEGIN TRANSACTION ;

-- Get next conversation group.

WAITFOR(
   GET CONVERSATION GROUP @conversation_group_id FROM MyServiceQueue),
   TIMEOUT 500 ;

-- Restore the state for this conversation group here

-- If there are no more conversation groups, break.

IF @conversation_group_id IS NULL
BEGIN
    ROLLBACK TRANSACTION ;
    BREAK ;
END ;

    -- Process all messages in the conversation group.

    WHILE 1 = 1
    BEGIN

        -- Get the next message.

        RECEIVE
           TOP(1)
           @conversation_handle = conversation_handle,
           @message_type_name = message_type_name,
           @message_body =
           CASE
              WHEN validation = 'X' THEN CAST(message_body AS XML)
              ELSE CAST(N'<none/>' AS XML)
          END
       FROM MyServiceQueue
       WHERE conversation_group_id = @conversation_group_id;

       -- If there is no message, or there is an error
       -- reading from the queue, break.

       IF @@ROWCOUNT = 0 OR @@ERROR <> 0
           BREAK;

       -- Process the message. In this case, the program ends the conversation
       -- for Error and EndDialog messages. For all other messages, the program
       -- produces a result set with information about the message.

       SELECT @conversation_handle,
              @message_type_name,
              @message_body ;

       -- If the message is an end dialog message or an error,
       -- end the conversation. Notice that other conversations
       -- in the same conversation group may still have messages
       -- to process. Therefore, the program does not break after
       -- ending the conversation.

       IF @message_type_name =
              'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
          OR @message_type_name =
              'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
       BEGIN
          END CONVERSATION @conversation_handle ;
       END ;

    END ; -- Process all messages in conversation group.

   COMMIT TRANSACTION ;

END ; -- Process all conversation groups.