Usuwanie typu poison wiadomości
A skażona wiadomość jest wiadomość zawierającą informacje, które pomyślnie nie może przetworzyć aplikacji.Na przykład stacja robocza produkcji może złożyć wniosek do wycofania części z magazynu przed Zmienianie kolejności powoduje, że część jest przestarzała.Zmienianie kolejności staje się skuteczne podczas żądania dla zapasów w drodze.Aplikacji do zarządzania zapasów odbiera żądanie ze stacja robocza, ale pomyślnie nie może przetworzyć żądania, a Operacja bazy danych, aby zaktualizował numer części w magazynie nie powiedzie się.Transakcja zawierające następnie operacji odbioru w rolkach, zwracania wiadomości do kolejki.W takiej sytuacji aplikacja będzie nadal otrzymywał ten sam komunikat, aktualizacja w dalszym ciągu nie powiedzie się i zwraca ją do kolejki.
skażona wiadomość nie jest uszkodzony komunikat i nie mogą być nieprawidłowe żądanie.usługa Broker zawiera wiadomość sprawdzania integralność wykrywać uszkodzony wiadomości.Aplikacja także zazwyczaj sprawdza poprawność zawartości wiadomości i odrzuca wiadomość z żądaniem niedozwolony.Z drugiej strony wiele komunikatów poison były ważne, kiedy wiadomość została utworzona, ale później stał się niemożliwe do procesu.
Automatyczne wykrywanie wiadomości poison
usługa Broker zawiera automatyczne skażona wiadomość wykrywania.Kiedy transakcja, która zawiera instrukcję przyjęcie ponownie toczy się pięć razy, usługa Broker wyłącza wszystkie kolejki, że transakcja otrzymane wiadomości, automatycznie ustawiając stan kolejki na OFF.Ponadto usługa Broker generuje zdarzenie tego typu Broker:Queue Disabled.
Administrator może użyć. SQL Server Agent alertów powiadamiany, gdy kolejka jest wyłączona. Projektant może także możliwość tworzenia aplikacji, która wykrywa kolejki jest wyłączona, usługa Broker.Często ta aplikacja sprawdzi wiadomości w kolejce w celu znalezienia skażona wiadomość.Gdy aplikacja określa, jaki komunikat nie można przetworzyć, aplikacja ustawia stan kolejki on i kończy się w konwersacji wiadomości z powodu błędu.Aplikacja, która wykrywa wiadomości poison należy uważać, aby wyczyścić dowolny stan, skojarzony z konwersacji przy kończeniu konwersacji.Aby uzyskać więcej informacji na temat tworzenia aplikacji w celu odzyskania poison wiadomości Zobacz Obsługa wiadomości typu poison.
Usuwanie wiadomości Poison Administratively
Większość aplikacji należy śledzić i programistycznie usunąć poison wiadomości.Jednak może być czasami trzeba usunąć skażona wiadomość ręcznie.Na przykład część aplikacji, które wykonuje odzyskiwanie nie będzie mógł wykryć skażona wiadomość lub nie można bezpiecznie oczyszczania zapisany stan dla komunikacji.
Ręczne usuwanie wiadomości jest uruchamiana ryzyko przerywania rozmowy ważne.Dlatego też zawsze sprawdzić skażona wiadomość przed usunięciem wiadomości z kolejki.Aby zobaczyć zawartości wiadomości, rozpocząć transakcję, otrzymują treści wiadomości, wyświetlić treści wiadomości, a następnie wycofać transakcji.Dopóki jest dodatnia, że dane wiadomość jest skażona wiadomość, ważne jest wycofać transakcji.
Przykład
W poniższym przykładzie pokazano, jak kontrolować wiadomości bezpieczne dla dojścia konwersacji e29059bb-9922-40f4-a575-66b2e4c70cf9 w kolejce ExpenseQueue.
use AdventureWorks ;
GO
-- Sample to show the content of a message, then return
-- the message to the queue. This may be useful to determine
-- whether a specific message cannot be processed due to the
-- content of the message.
-- Every exit path from the transaction rolls back the transaction.
-- This code is intended to inspect the message, not remove the
-- message from the queue permanently. The transaction must roll
-- back to return the message to the queue.
BEGIN TRANSACTION ;
-- To print the body, the code needs the message_body and
-- the encoding_format.
DECLARE @messageBody VARBINARY(MAX),
@validation NCHAR ;
-- Receive the message. The WAITFOR handles the case where
-- an application is attempting to process the message when
-- this batch is submitted. Replace the name of the queue and
-- the conversation_handle value.
WAITFOR(
RECEIVE TOP(1)
@messageBody = message_body,
@validation = validation
FROM dbo.ExpenseQueue
WHERE conversation_handle =
'e29059bb-9922-40f4-a575-66b2e4c70cf9'
), TIMEOUT 2000 ;
-- Rollback and exit if the message is not available
-- in two seconds.
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION ;
PRINT 'No message available.' ;
RETURN ;
END
-- Print the message based on the encoding format of
-- the message body.
IF (@validation = 'E')
BEGIN
PRINT 'Empty message.' ;
END ;
ELSE IF (@validation = 'X')
BEGIN
PRINT CONVERT(nvarchar(MAX), @messageBody) ;
END ;
ELSE IF (@validation = 'N')
BEGIN
PRINT 'No validation -- binary message:'
PRINT @messageBody ;
END
ROLLBACK TRANSACTION
GO
Po znalezieniu skażona wiadomość kończenia konwersacji.W poniższym przykładzie kończy się do konwersacji e29059bb-9922-40f4-a575-66b2e4c70cf9.
-- End the conversation. Do this only if the message cannot be
-- processed by the normal procedure.
END CONVERSATION 'e29059bb-9922-40f4-a575-66b2e4c70cf9'
WITH ERROR = 127 DESCRIPTION = N'Unable to process message.' ;
GO
Po zakończeniu konwersacji, usługa Broker odrzuca wiadomości do tej konwersacji.Należy zauważyć, że aplikacja, która normalnie przetwarza wiadomość nie odbiera EndDialog or Błąd wiadomości do tej konwersacji.Dlatego jeśli aplikacja przechowuje stan, należy uważać, aby usunąć stan, skojarzony z konwersacji po Kończenie konwersacji z powodu błędu.
Jeśli usługa nie może przetworzyć wiadomości, oznacza to, że usługa nie może wykonać tego zadania, do konwersacji.Kończenie konwersacji z powodu błędu powiadamia użytkownika, inni uczestnicy konwersacji, które zadania nie powiodło się.
See Also