Service Broker aplikacji konspektu
Większość aplikacji Service Broker wykonaj podstawowe czynności odbierać i przetwarzać wiadomości:
Aplikacja zaczyna transakcji.
Jeśli aplikacja zachowuje stan, aplikacja pobiera identyfikator grupa konwersacji.Aplikacja używa tego identyfikatora przywracanie stanu z tabela stanu.Jeśli ma żadnej grupa konwersacji z wiadomości, które są gotowe do przyjęcia, aplikacja wycofuje transakcję i kończy pracę.
Aplikacja otrzymuje jeden lub więcej wiadomości z kolejki.Jeśli aplikacja ma identyfikator grupa konwersacji, aplikacja używa identyfikatora grupa konwersacji odbieranie wiadomości dla danej grupa konwersacji.Jeśli więcej wiadomości nie są dostępne do otrzymania, aplikacja zatwierdza transakcję i zwraca do kroku 1.
Aplikacja sprawdza poprawność zawartości wiadomości na podstawie nazwy typ komunikatu.
Aplikacja przetwarza wiadomości, na podstawie nazwy typ komunikatu i zawartość wiadomości.
Aplikacja wysyła komunikaty, które w wyniku przetworzenia.
Jeśli aplikacja zachowuje stan, aplikacja aktualizuje tabela Państwa, przy użyciu identyfikatora grupa konwersacji jako klucz podstawowy tabela.
Aplikacja zwraca do kroku 3, aby sprawdzić, czy dostępne są więcej wiadomości.
Dokładne strukturę aplikacji zależy od wymagań aplikacji, styl komunikacji aplikacji, czy aplikacja jest usługa miejsce docelowe lub inicjujący i czy Service Broker uaktywnia aplikacji lub nie.
Na przykład aplikacja inicjujący wysyła wiadomość przed jej uruchomieniem pętli przetwarzania, opisane w poprzednich krokach.Usługa inicjujący może wysłać wiadomość z innego programu lub procedura składowana, a następnie użyj procedura składowana aktywacja inicjujący kolejki usługi.Na przykład aplikacja zapis zamówienia może zawierać aplikacji zewnętrznej, który inicjuje komunikację wprowadzić zamówienia.Po wprowadzeniu kolejność aplikacji zewnętrznej konieczne nie pozostają uruchomione.procedura składowana aktywacja usługa inicjujący wysyła potwierdzenie zamówienia po zwraca odpowiedź z usługa zamówienia.procedura składowana aktywacja przetwarza także dowolny usługa Broker komunikaty o błędach, które są zwracane przez obiekt miejsce docelowe usługi i wysyła powiadomienia, że nie zostanie potwierdzone zamówienia.
Alternatywnie zamiast wysyłania wiadomości z innego programu, aplikacji inicjującej może wysłać wiadomość i uruchom pętli przetwarzania jako część tego samego programu.Niezależnie od wahania te podstawowe konspektu pozostaje taka sama.
Aplikacja, która przetwarza dużą liczbę wiadomości do tej samej grupa konwersacji może zachować liczba odebranych komunikatów i przekazać zatwierdzanie po przetworzeniu liczbę komunikatów.Strategia ta liczba i zatwierdzanie umożliwia aplikacji transakcje stosunkowo krótki i umożliwia stosowanie różnych konwersacji grup procesów.
Przykład
Następujące Transact-SQL przykład przetwarza wszystkie wiadomości w kolejce MyServiceQueue.Przetwarzanie wiadomości jest minimalny.Jeśli wiadomość jest EndDialog lub Błąd wiadomości kod zakończenia konwersacji.Dla każdej wiadomości kod tworzy reprezentację XML wiadomości i powstały zestaw wyników zawierający dojście do konwersacji, nazwa typ komunikatu oraz XML.Gdy wiadomości nie są dostępne dla 500 milisekund, kod zamyka.
Dla uproszczenia skrypt tworzy zestaw wyników dla każdej wiadomości.Jeśli wystąpi błąd podczas odczytu z kolejki, skrypt zatwierdza zmiany bez wytwarzania wyniki.Dlatego ten skrypt dyskretnie usunie wszystkie wiadomości, które powodują wystąpienie błędu.
Ostrzeżenie
Ponieważ skrypt wyświetla po prostu wiadomości, wiadomości nie są możliwe dla tego skryptu.Dlatego skrypt nie zawiera kodu obsługi wiadomości.Aplikacja produkcji powinny być zapisywane do obsługi wiadomości.Więcej informacji na temat wiadomości, zobacz Obsługa wiadomości Poison.
USE AdventureWorks2008R2 ;
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.
Zobacz także