Udostępnij za pośrednictwem


Usuwanie wiadomości Poison

A skażona wiadomość jest komunikat zawierający informacje, że aplikacja nie może pomyślnie przetworzyć.Na przykład stacja robocza wytwarzania może złożyć wniosek o wycofaniu części z magazynu tuż przed Zmień kolejność sprawia, że część jest przestarzały.Zmienianie kolejności staje się skuteczne podczas żądania dla zapasów w drodze.Aplikacja do zarządzania zapasów odbiera żądanie ze stacja robocza, ale pomyślnie nie może przetworzyć żądania i niepowodzenia operacji bazy danych do aktualizowania liczby części w magazynie.Transakcja zawierające następnie operacji odbioru wycofuje, zwracania wiadomości do kolejki.W tej sytuacji aplikacja będzie nadal otrzymywał ten sam komunikat, aktualizacja nadal się nie udaje i zwraca wiadomość do kolejki.

A skażona wiadomość nie jest uszkodzony i nie może być nieprawidłowe żądanie.Service Broker zawiera komunikat, sprawdza integralność, który wykrywać uszkodzony wiadomości.Aplikacja także zazwyczaj sprawdza poprawność zawartości wiadomości i odrzuca wiadomość, która zawiera niedozwolony żądania.Natomiast wiele wiadomości były ważne, kiedy wiadomość została utworzona, ale później stał się niemożliwe do procesu.

Automatyczne wykrywanie wiadomości Poison

Service Broker umożliwia automatyczne skażona wiadomość wykrywania.Gdy transakcja, która zawiera odbioru instrukcja zwojach wstecz pięć razy wszystkich kolejek, że transakcja otrzymane wiadomości, automatycznie ustawiając stan kolejki na OFF Wyłącza Service Broker.Ponadto Service Broker generuje zdarzenie typu Broker:Queue Disabled.

Administrator może użyć SQL Server Agent alertów powiadamiany, gdy kolejka jest wyłączona.Programista można również utworzyć aplikację, która wykrywa kolejki jest wyłączona, Service Broker.Często aplikację sprawdzi wiadomości w kolejce, aby znaleźć skażona wiadomość.Po aplikacji określa, które wiadomości nie mogą być przetwarzane, aplikacja ustawia stan kolejki na i kończy konwersacji wiadomości z powodu błędu.Aplikacja, która wykrywa wiadomości należy staranne oczyszczenie każde Państwo związane z konwersacji przy kończeniu konwersacji.Aby uzyskać więcej informacji na temat tworzenia aplikacji do odzyskać z wiadomości, zobacz Obsługa wiadomości Poison.

Usuwanie wiadomości Poison administracyjnie

Większość aplikacji należy śledzić i Usuń wiadomości programowo.Jednak może czasami być konieczne usunięcie skażona wiadomość ręcznie.Na przykład część aplikacji, który wykonuje odzyskiwanie nie można wykryć skażona wiadomość, lub może nie móc bezpiecznie Oczyszczanie zapisany stan dla konwersacji.

Ręczne usuwanie wiadomości jest zagrożona przerywania ważne konwersacji.Dlatego zawsze sprawdzać skażona wiadomość przed usunięciem wiadomości z kolejki.Aby wyświetlić zawartość wiadomości, rozpocząć transakcji, otrzymywać wiadomości, wyświetlić treści wiadomości i następnie wycofać transakcji.Dopóki nie są pozytywne, że przedmiotowe wiadomość jest skażona wiadomość, ważne jest, aby wycofać transakcji.

Przykład

W poniższym przykładzie inspekcja wiadomość bezpiecznie dojście do konwersacji e29059bb-9922-40f4-a575-66b2e4c70cf9 w kolejce ExpenseQueue.

use AdventureWorks2008R2 ;
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 ;

  -- Roll back 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ść, zakończyć konwersację.Poniższy przykład kończy 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

Zakończeniu konwersacja Service Broker odrzuca wiadomości dla tej konwersacji.Należy zauważyć, że aplikacja, która normalnie przetwarza wiadomość nie otrzyma EndDialog lub Błąd wiadomości w konwersacji.Dlatego jeśli aplikacja zachowuje stan, należy zachować ostrożność usunąć stan skojarzony z konwersacji po Kończenie konwersacji z błędem.

Jeśli usługa nie może przetworzyć wiadomości, oznacza to, że usługa nie może ukończyć zadanie dla konwersacji.Kończenie konwersacji z błędem powiadamia uczestnik konwersacji, że zadanie nie powiodło się.