Behandlung nicht verarbeitbarer NachrichtenPoison Message Handling

Ein nicht verarbeitbare Nachricht ist eine Nachricht, die die maximale Anzahl der Zustellversuche an die Anwendung überschritten hat.A poison message is a message that has exceeded the maximum number of delivery attempts to the application. Diese Situation kann auftreten, wenn eine warteschlangenbasierte Anwendung aufgrund der Fehler keine Nachricht verarbeiten kann.This situation can arise when a queue-based application cannot process a message because of errors. Um Zuverlässigkeitsforderungen zu erfüllen, empfängt eine in der Warteschlange stehende Anwendung Nachrichten unter einer Transaktion.To meet reliability demands, a queued application receives messages under a transaction. Beim Abbrechen der Transaktion, in der eine in der Warteschlange stehende Nachricht empfangen wurde, bleibt die Nachricht in der Warteschlange und wird dann unter einer neuen Transaktion wiederholt.Aborting the transaction in which a queued message was received leaves the message in the queue so that the message is retried under a new transaction. Wenn das Problem, das zum Abbrechen der Transaktion geführt hat, nicht korrigiert wird, kann die empfangende Anwendung in einer Schleife hängen bleiben, in der sie dieselbe Nachricht immer wieder empfängt und abbricht, bis die maximale Anzahl der Zustellversuche überschritten ist. Auf diese Weise entsteht eine nicht verarbeitbare Nachricht.If the problem that caused the transaction to abort is not corrected, the receiving application can get stuck in a loop receiving and aborting the same message until the maximum number of delivery attempts has been exceeded and a poison message results.

Eine Nachricht kann aus vielen Gründen zu einer nicht verarbeitbaren Nachrichten werden.A message can become a poison message for many reasons. Die häufigsten Ursachen sind anwendungsspezifisch.The most common reasons are application specific. Wenn beispielsweise eine Anwendung eine Nachricht aus einer Warteschlange liest und dann Datenbankprozesse durchführt, kann es vorkommen, dass von der Anwendung keine Sperre für die Datenbank bewirkt werden kann. Dies führt dann dazu, dass sie die Transaktion abbricht.For example, if an application reads a message from a queue and performs some database processing, the application may fail to get a lock on the database, causing it to abort the transaction. Da die Datenbanktransaktion abgebrochen wurde, verbleibt die Nachricht in der Warteschlange, wodurch die Nachricht von der Anwendung ein zweites Mal gelesen und ein neuer Versuch gestartet wird, eine Sperrung der Datenbank zu bewirken.Because the database transaction was aborted, the message remains in the queue, which causes the application to reread the message a second time and make another attempt to acquire a lock on the database. Nachrichten können auch nicht verarbeitbar werden, wenn sie ungültige Informationen enthalten.Messages can also become poison if they contain invalid information. So enthält z. B. eine Bestellung möglicherweise eine ungültige Kundennummer.For example, a purchase order may contain an invalid customer number. In diesen Fällen kann die Anwendung die Transaktion freiwillig abbrechen und die Nachricht zwingen, eine nicht verarbeitbare Nachricht zu werden.In these cases, the application may voluntarily abort the transaction and force the message to become a poison message.

Bei seltenen Gelegenheiten können Nachrichten nicht zur Anwendung weitergeleitet werden.On rare occasions, messages can fail to get dispatched to the application. Der Windows Communication Foundation (WCF)-Schicht kann ein Problem mit der Nachricht feststellen, wie z. B. verfügt die Nachricht den falschen Frame, ungültige nachrichtenanmeldeinformationen im Anhang oder einen ungültigen aktionsheader.The Windows Communication Foundation (WCF) layer may find a problem with the message, such as if the message has the wrong frame, invalid message credentials attached to it, or an invalid action header. In diesen Fällen empfängt die Anwendung die Nachricht niemals; trotzdem kann die Nachricht noch zu einer nicht verarbeitbaren Nachricht werden, die manuell verarbeitet werden kann.In these cases, the application never receives the message; however, the message can still become a poison message and be processed manually.

Behandeln von nicht verarbeitbaren NachrichtenHandling Poison Messages

In WCF bietet die Handhabung beschädigter Nachrichten einen Mechanismus für eine empfangende Anwendung zurecht zur Anwendung weitergeleitet werden können, oder Nachrichten, die an die Anwendung zugestellt werden jedoch Überprüfungen schlagen fehl, die aufgrund von anwendungsspezifischen verarbeitet werden Gründe.In WCF, poison message handling provides a mechanism for a receiving application to deal with messages that cannot be dispatched to the application, or messages that are dispatched to the application but which fail to be processed because of application-specific reasons. Die Konfiguration der Behandlung nicht verarbeitbarer Nachrichten erfolgt in jeder der verfügbaren, in der Warteschlange stehenden Bindungen durch die folgenden Eigenschaften:Poison message handling is configured by the following properties in each of the available queued bindings:

  • ReceiveRetryCount.ReceiveRetryCount. Ein Ganzzahlwert, die die maximale Anzahl der Neuversuche für den Versand einer Nachricht von der Anwendungswarteschlange zu der Anwendung angibt.An integer value that indicates the maximum number of times to retry delivery of a message from the application queue to the application. Der Standardwert ist 5.The default value is 5. Dieser Wert ist in Fällen ausreichend, in denen eine sofortige Wiederholung das Problem behebt, beispielsweise wenn ein temporärer Deadlock für eine Datenbank vorliegt.This is sufficient in cases where an immediate retry fixes the problem, such as with a temporary deadlock on a database.

  • MaxRetryCycles.MaxRetryCycles. Ein Ganzzahlwert, der die maximale Anzahl der Wiederholungszyklen angibt.An integer value that indicates the maximum number of retry cycles. Ein Wiederholungszyklus umfasst die Übertragung einer Nachricht von der Anwendungswarteschlange zur untergeordneten Wiederholungswarteschlange und – nach einer konfigurierbaren Verzögerung – die Rückübertragung der Nachricht aus der untergeordneten Wiederholungswarteschlange zur Anwendungswarteschlange, um einen erneuten Zustellversuch zu unternehmen.A retry cycle consists of transferring a message from the application queue to the retry subqueue and, after a configurable delay, from the retry subqueue back into the application queue to reattempt delivery. Der Standardwert ist 2.The default value is 2. In Windows VistaWindows Vista erfolgen maximal (ReceiveRetryCount +1) * (MaxRetryCycles + 1) Versuche.On Windows VistaWindows Vista, the message is tried a maximum of (ReceiveRetryCount +1) * (MaxRetryCycles + 1) times. MaxRetryCycles wird für Windows Server 2003Windows Server 2003 und Windows XPWindows XP ignoriert.MaxRetryCycles is ignored on Windows Server 2003Windows Server 2003 and Windows XPWindows XP.

  • RetryCycleDelay.RetryCycleDelay. Die Verzögerungszeit für Wiederholungszyklen.The time delay between retry cycles. Der Standardwert ist 30 Minuten.The default value is 30 minutes. MaxRetryCycles und RetryCycleDelay bieten gemeinsam einen Mechanismus zur Behandlung des Problems, wenn eine Wiederholung nach einer periodischen Verzögerung das Problem behebt.MaxRetryCycles and RetryCycleDelay together provide a mechanism to address the problem where a retry after a periodic delay fixes the problem. Damit wird z. B. ein gesperrtes Rowset bei einem in SQL Server anstehenden Transaktionscommit behandelt.For example, this handles a locked row set in SQL Server pending transaction commit.

  • ReceiveErrorHandling.ReceiveErrorHandling. Eine Enumeration, die angibt, welche Aktion für eine Nachricht erfolgen soll, deren Zustellung auch nach der maximalen Anzahl von Wiederholungen fehlgeschlagen ist.An enumeration that indicates the action to take for a message that has failed delivery after the maximum number of retries has been attempted. Die Werte können "Fehler", "Ablage", "Ablehnen" und "Verschieben" sein.The values can be Fault, Drop, Reject, and Move. Die Standardoption ist "Fehler".The default option is Fault.

  • Fehler.Fault. Diese Option sendet einen Fehler an den Listener, der bewirkt hat, dass der ServiceHost fehlerhaft agiert.This option sends a fault to the listener that caused the ServiceHost to fault. Die Nachricht muss durch einen externen Mechanismus aus der Anwendungswarteschlange entfernt werden, bevor die Anwendung mit der Verarbeitung von Nachrichten aus der Warteschlange fortfahren kann.The message must be removed from the application queue by some external mechanism before the application can continue to process messages from the queue.

  • Ablage.Drop. Diese Option legt die nicht verarbeitbare Nachricht ab, und die Nachricht wird der Anwendung nie zugestellt.This option drops the poison message and the message is never delivered to the application. Wenn die Eigenschaft TimeToLive der Nachricht zu diesem Zeitpunkt bereits abgelaufen ist, kann die Nachricht in der Warteschlange für unzustellbare Nachrichten des Absenders angezeigt werden.If the message's TimeToLive property has expired at this point, then the message may appear in the sender's dead-letter queue. Andernfalls wird die Nachricht nirgendwo angezeigt.If not, the message does not appear anywhere. Diese Option gibt an, dass vom Benutzer keine Aktion für den Fall angegeben wurde, dass die Nachricht verloren geht.This option indicates that the user has not specified what to do if the message is lost.

  • Ablehnen.Reject. Diese Option ist nur in Windows VistaWindows Vista verfügbar.This option is available only on Windows VistaWindows Vista. Damit wird das Message Queuing (MSMQ) angewiesen, eine negative Bestätigung mit dem Hinweis, dass die Anwendung die Nachricht nicht empfangen kann, an den sendenden Warteschlangen-Manager zu senden.This instructs Message Queuing (MSMQ) to send a negative acknowledgement back to the sending queue manager that the application cannot receive the message. Die Nachricht wird in die Warteschlange für unzustellbare Nachrichten des sendenden Warteschlangen-Managers eingefügt.The message is placed in the sending queue manager's dead-letter queue.

  • Verschieben.Move. Diese Option ist nur in Windows VistaWindows Vista verfügbar.This option is available only on Windows VistaWindows Vista. Damit wird die nicht verarbeitbare Nachricht in eine Warteschlange für potenziell schädliche Nachrichten verschoben, sodass sie später durch eine Anwendung zur Behandlung nicht verarbeitbarer Nachrichten verarbeitet werden kann.This moves the poison message to a poison-message queue for later processing by a poison-message handling application. Die Warteschlange für potenziell schädliche Nachrichten ist eine untergeordnete Warteschlange der Anwendungswarteschlange.The poison-message queue is a subqueue of the application queue. Eine Anwendung für die Handhabung beschädigter Nachrichten kann es sich um einen WCF-Dienst sein, der Nachrichten aus der Warteschlange für potenziell schädliche Nachrichten liest.A poison-message handling application can be a WCF service that reads messages out of the poison queue. Die Warteschlange für potenziell schädliche Nachrichten ist eine Unterwarteschlange der Anwendungswarteschlange und kann als net.msmq:// adressiert werden<Computername>/ApplicationQueue; poison, wobei Computername ist der Name des Computers, auf dem die Warteschlange befindet, und die ApplicationQueue ist der Name der anwendungsspezifischen Warteschlange.The poison queue is a subqueue of the application queue and can be addressed as net.msmq://<machine-name>/applicationQueue;poison, where machine-name is the name of the computer on which the queue resides and the applicationQueue is the name of the application-specific queue.

Im Folgenden ist die maximale Anzahl von für eine Nachricht durchgeführten Übermittlungsversuchen dargestellt:The following are the maximum number of delivery attempts made for a message:

  • ((ReceiveRetryCount+1) * (MaxRetryCycles + 1)) auf Windows VistaWindows Vista.((ReceiveRetryCount+1) * (MaxRetryCycles + 1)) on Windows VistaWindows Vista.

  • (ReceiveRetryCount+1) auf Windows Server 2003Windows Server 2003 und Windows XPWindows XP.(ReceiveRetryCount + 1) on Windows Server 2003Windows Server 2003 and Windows XPWindows XP.

Hinweis

Für eine Nachricht, die erfolgreich zugestellt wird, werden keine Wiederholungen durchgeführt.No retries are made for a message that is delivered successfully.

Zur Nachverfolgung, wie oft das Lesen einer Nachricht versucht wurde, verfügt Windows VistaWindows Vista über eine dauerhafte Nachrichteneigenschaft, die die Anzahl der Abbrüche zählt, und über eine Verschiebungszähleigenschaft, die zählt, wie oft die Nachricht zwischen der Anwendungswarteschlange und den untergeordneten Warteschlangen verschoben wurde.To keep track of the number of times a message read is attempted, Windows VistaWindows Vista maintains a durable message property that counts the number of aborts and a move count property that counts the number of times the message moves between the application queue and subqueues. Der WCF-Kanal verwendet diese zur Berechnung der empfangswiederholungsanzahl und der wiederholungszyklusanzahl.The WCF channel uses these to compute the receive retry count and the retry cycles count. Auf Windows Server 2003Windows Server 2003 und Windows XPWindows XP, die abbruchanzahl im Arbeitsspeicher von der WCF-Kanal geführt und zurückgesetzt, wenn die Anwendung fehlschlägt.On Windows Server 2003Windows Server 2003 and Windows XPWindows XP, the abort count is maintained in memory by the WCF channel and is reset if the application fails. Darüber hinaus kann der WCF-Kanal die abbruchanzahl für bis zu 256 Nachrichten im Arbeitsspeicher zu einem beliebigen Zeitpunkt Partitionen.Also, the WCF channel can hold the abort counts for up to 256 messages in memory at any time. Wenn eine 257. Nachricht gelesen wird, dann wird die Abbruchanzahl der ältesten Nachricht zurückgesetzt.If a 257th message is read, then the oldest message's abort count is reset.

Die Abbruchanzahl- und Verschiebungsanzahleigenschaften stehen dem Dienstvorgang durch den Vorgangskontext zur Verfügung.The abort count and move count properties are available to the service operation through the operation context. Im folgenden Codebeispiel wird der Zugriff darauf veranschaulicht.The following code example shows how to access them.

MsmqMessageProperty mqProp = OperationContext.Current.IncomingMessageProperties[MsmqMessageProperty.Name] as MsmqMessageProperty;
Console.WriteLine("Abort count: {0} ", mqProp.AbortCount);
Console.WriteLine("Move count: {0} ", mqProp.MoveCount);
// code to submit purchase order ...

WCF stellt zwei in der Warteschlange stehende standardbindungen bereit:WCF provides two standard queued bindings:

  • NetMsmqBindingNetMsmqBinding. Ein .NET Framework.NET Framework Bindung zum Ausführen warteschlangenbasierter Kommunikation mit anderen WCF-Endpunkten geeignet ist.A .NET Framework.NET Framework binding suitable for performing queue-based communication with other WCF endpoints.

  • MsmqIntegrationBindingMsmqIntegrationBinding. Eine Bindung, die zur Kommunikation mit vorhandenen Message Queuing-Anwendungen geeignet ist.A binding suitable for communicating with existing Message Queuing applications.

Hinweis

Sie können Eigenschaften in diesen Bindungen auf der Grundlage der Anforderungen der WCF-Dienst ändern.You can alter properties in these bindings based on the requirements of your WCF service. Der gesamte Mechanismus zur Behandlung nicht verarbeitbarer Nachrichten ist zur empfangenden Anwendung lokal.The entire poison message handling mechanism is local to the receiving application. Der Prozess ist für die sendende Anwendung unsichtbar, es sei denn, die empfangende Anwendung beendet den Vorgang und sendet eine negative Bestätigung an den Absender zurück.The process is invisible to the sending application unless the receiving application ultimately stops and sends a negative acknowledgment back to the sender. In diesem Fall wird die Nachricht in die Warteschlange für unzustellbare Nachrichten des Absenders verschoben.In that case, the message is moved to the sender's dead-letter queue.

Empfohlene Vorgehensweise: Behandlung MsmqPoisonMessageExceptionBest Practice: Handling MsmqPoisonMessageException

Wenn der Dienst feststellt, dass eine Nachricht nicht verarbeitbar ist, löst der Warteschlangentransport eine MsmqPoisonMessageException aus, die die LookupId der nicht verarbeitbaren Nachricht enthält.When the service determines that a message is poison, the queued transport throws a MsmqPoisonMessageException that contains the LookupId of the poison message.

Eine empfangende Anwendung kann die IErrorHandler-Schnittstelle implementieren, um alle Fehler zu behandeln, die die Anwendung erfordert.A receiving application can implement the IErrorHandler interface to handle any errors that the application requires. Weitere Informationen finden Sie unter erweitern Steuerelement über Fehlerbehandlung und Berichterstattung.For more information, see Extending Control Over Error Handling and Reporting.

Die Anwendung erfordert möglicherweise eine bestimmte automatische Behandlung von nicht verarbeitbaren Nachrichten, mit der die nicht verarbeitbaren Nachrichten in eine entsprechende Warteschlange verschoben werden, sodass der Dienst auf die restlichen Nachrichten in der Warteschlange zugreifen kann.The application may require some kind of automated handling of poison messages that moves the poison messages to a poison message queue so that the service can access the rest of the messages in the queue. Das einzige Szenario, in dem der Fehlerbehandlungsmechanismus zum Abhören auf Ausnahmen für nicht verarbeitbare Nachrichten verwendet werden kann, liegt vor, wenn die ReceiveErrorHandling-Einstellung auf Fault festgelegt ist.The only scenario for using the error-handler mechanism to listen for poison-message exceptions is when the ReceiveErrorHandling setting is set to Fault. Das Beispiel der nicht verarbeitbaren Nachricht für Message Queuing 3.0 veranschaulicht dieses Verhalten.The poison-message sample for Message Queuing 3.0 demonstrates this behavior. Im Folgenden werden die Schritte zur Behandlung nicht verarbeitbarer Nachrichten, einschließlich empfohlener Vorgehensweisen, umrissen:The following outlines the steps to take to handle poison messages, including best practices:

  1. Stellen Sie sicher, dass die Einstellungen für nicht verarbeitbare Nachrichten den Anforderungen Ihrer Anwendung entsprechen.Ensure your poison settings reflect the requirements of your application. Stellen Sie bei der Arbeit mit diesen Einstellungen sicher, dass Ihnen die Unterschiede zwischen den Message Queuing-Fähigkeiten in Windows VistaWindows Vista, Windows Server 2003Windows Server 2003 und Windows XPWindows XP bekannt sind.When working with the settings, ensure that you understand the differences between the capabilities of Message Queuing on Windows VistaWindows Vista, Windows Server 2003Windows Server 2003, and Windows XPWindows XP.

  2. Implementieren Sie falls erforderlich den IErrorHandler, um Fehler mit nicht verarbeitbaren Nachrichten zu behandeln.If required, implement the IErrorHandler to handle poison-message errors. Das das Festlegen von ReceiveErrorHandling auf Fault einen manuellen Mechanismus zum Verschieben der nicht verarbeitbaren Nachricht aus der Warteschlange oder zum Korrigieren eines Problems mit externen Abhängigkeiten erfordert, besteht die typische Nutzung darin, den IErrorHandler zu implementieren, wenn ReceiveErrorHandling auf Fault festgelegt ist, wie im folgenden Code gezeigt:Because setting ReceiveErrorHandling to Fault requires a manual mechanism to move the poison message out of the queue or to correct an external dependent issue, the typical usage is to implement IErrorHandler when ReceiveErrorHandling is set to Fault, as shown in the following code.

    class PoisonErrorHandler : IErrorHandler
    {
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            // No-op -We are not interested in this. This is only useful if you want to send back a fault on the wire�not applicable for queues [one-way].
        }
    
        public bool HandleError(Exception error)
        {
            if (error != null && error.GetType() == typeof(MsmqPoisonMessageException))
            {
                Console.WriteLine(" Poisoned message -message look up id = {0}", ((MsmqPoisonMessageException)error).MessageLookupId);
                return true;
            }
    
            return false;
        }
    }
    
  3. Erstellen Sie ein PoisonBehaviorAttribute, das das Dienstverhalten verwenden kann.Create a PoisonBehaviorAttribute that the service behavior can use. Das Verhalten installiert den IErrorHandler auf dem Verteiler.The behavior installs the IErrorHandler on the dispatcher. Siehe nachstehendes Codebeispiel.See the following code example.

    public class PoisonErrorBehaviorAttribute : Attribute, IServiceBehavior
    {
        Type errorHandlerType;
    
        public PoisonErrorBehaviorAttribute(Type errorHandlerType)
        {
            this.errorHandlerType = errorHandlerType;
        }
    
        void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
        {
        }
    
        void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
        {
        }
    
        void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
        {
            IErrorHandler errorHandler;
    
            try
            {
                errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
            }
            catch (MissingMethodException e)
            {
                throw new ArgumentException("The errorHandlerType specified in the PoisonErrorBehaviorAttribute constructor must have a public empty constructor", e);
            }
            catch (InvalidCastException e)
            {
                throw new ArgumentException("The errorHandlerType specified in the PoisonErrorBehaviorAttribute constructor must implement System.ServiceModel.Dispatcher.IErrorHandler", e);
            }
    
            foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
            {
                ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
                channelDispatcher.ErrorHandlers.Add(errorHandler);
            }
        }
    }
    
  4. Stellen Sie sicher, dass der Dienst mit dem Verhaltensattribut für nicht verarbeitbare Nachrichten kommentiert wird.Ensure that your service is annotated with the poison behavior attribute.

Wenn außerdem das ReceiveErrorHandling auf Fault festgelegt ist, tritt beim ServiceHost ein Fehler auf, wenn dieser auf die nicht verarbeitbare Nachricht stößt.In addition, if the ReceiveErrorHandling is set to Fault, the ServiceHost faults when encountering the poison message. Sie können sich dem Fehlerereignis zuwenden und den Dienst herunterfahren, Gegenmaßnahmen treffen und neu starten.You can hook up to the faulted event and shut down the service, take corrective actions, and restart. Beispielsweise kann die LookupId in der MsmqPoisonMessageException, die an den IErrorHandler weitergegeben wurde, notiert werden. Tritt nun beim Diensthost ein Fehler auf, können Sie die System.Messaging-API verwenden, um die Nachricht mithilfe der LookupId aus der Warteschlange zu empfangen, die Nachricht aus der Warteschlange zu entfernen und die Nachricht in einem externen Speicher oder einer anderen Warteschlange zu speichern.For example, the LookupId in the MsmqPoisonMessageException propagated to the IErrorHandler can be noted and when the service host faults, you could use the System.Messaging API to receive the message from the queue using the LookupId to remove the message from the queue and store the message in some external store or another queue. Sie können dann den ServiceHost neu starten, um die normale Verarbeitung fortzusetzen.You can then restart ServiceHost to resume normal processing. Die Nachrichtenbehandlung nicht verarbeitbarer Nachrichten in MSMQ 4.0 veranschaulicht dieses Verhalten.The Poison Message Handling in MSMQ 4.0 demonstrates this behavior.

Transaktionstimeout und nicht verarbeitbare NachrichtenTransaction Time-Out and Poison Messages

Eine Klasse von Fehlern kann zwischen dem Wartenschlangentransportkanal und dem Benutzercode auftreten.A class of errors can occur between the queued transport channel and the user code. Diese Fehler können durch Zwischenschichten erkannt werden, beispielsweise die Nachrichtensicherheitsschicht oder die Dienstverteilungslogik.These errors can be detected by layers in-between, such as the message security layer or the service dispatching logic. So stellen beispielsweise ein in der SOAP-Sicherheitsschicht erkanntes fehlendes X.509-Zertifikat und eine fehlende Aktion Fälle dar, in denen die Nachricht nicht an die Anwendung verteilt wird.For example, a missing X.509 certificate detected in the SOAP security layer and a missing action are cases where the message does get dispatched to the application. In diesem Fall wird die Nachricht durch das Dienstmodell wieder abgelegt.When this happens, the service model drops the message. Da die Nachricht in einer Transaktion gelesen wird und ein Ergebnis für diese Transaktion nicht geliefert werden kann, kommt es letztlich zum Timeout der Transaktion, sie wird abgebrochen, und die Nachricht wird wieder in die Warteschlange zurückgestellt.Because the message is read in a transaction and an outcome for that transaction cannot be provided, the transaction eventually times out, aborts, and the message is put back into the queue. Mit anderen Worten: Für eine bestimmte Fehlerklasse führt die Transaktion keinen sofortigen Abbruch durch, sondern wartet, bis es zum Timeout der Transaktion kommt. Sie können das Transaktionstimeout für einen Dienst mit ServiceBehaviorAttribute ändern.In other words, for a certain class of errors, the transaction does not immediately abort but waits until the transaction times out. You can modify the transaction time-out for a service using ServiceBehaviorAttribute.

Um das Transaktionstimeout auf einer computerweiten Basis zu ändern, modifizieren Sie die machine.config-Datei und legen das entsprechende Transaktionstimeout fest. Wichtig: Die Transaktion wird in Abhängigkeit vom festgelegten Transaktionstimeout schließlich abgebrochen, wieder in der Warteschlange platziert, und die Abbruchanzahl wird erhöht.To change the transaction time-out on a computer-wide basis, modify the machine.config file and set the appropriate transaction time-out. It is important to note that, depending on the time-out set in the transaction, the transaction eventually aborts and goes back to the queue and its abort count is incremented. Schließlich wird die Nachricht nicht verarbeitbar, und die richtige Disposition wird entsprechend den Benutzereinstellungen gewählt.Eventually, the message becomes poison and the right disposition is made according to the user settings.

Sitzungen und nicht verarbeitbare NachrichtenSessions and Poison Messages

Eine Sitzung durchläuft die gleichen Wiederholungsprozeduren und Prozeduren zur Behandlung nicht verarbeitbarer Nachrichten wie eine einzelne Nachricht.A session undergoes the same retry and poison-message handling procedures as a single message. Die zuvor aufgeführten Eigenschaften für nicht verarbeitbare Nachrichten gelten auch für die ganze Sitzung,The properties previously listed for poison messages apply to the entire session. d. h., dass die gesamte Sitzung wiederholt wird und schließlich in einer Warteschlange für potenziell schädliche Nachrichten oder in der Absenderwarteschlange für unzustellbare Nachrichten platziert wird, wenn die Nachricht abgelehnt wird.This means that the entire session is retried and goes to a final poison-message queue or the sender’s dead-letter queue if the message is rejected.

Batchverarbeitung und nicht verarbeitbare NachrichtenBatching and Poison Messages

Wenn eine Nachricht zu einer nicht verarbeitbaren Nachricht wird und Teil eines Batches ist, wird für den gesamten Batch ein Rollback durchgeführt, und der Kanal kehrt zum Lesen einzelner Nachrichten zurück.If a message becomes a poison message and is part of a batch, then the entire batch is rolled back and the channel returns to reading one message at a time. Weitere Informationen zur Batchverarbeitung finden Sie unter Batchverarbeitung von Nachrichten in einer TransaktionFor more information about batching, see Batching Messages in a Transaction

Behandlung nicht verarbeitbarer Nachrichten für Nachrichten in einer Warteschlange für potenziell schädliche NachrichtenPoison-message Handling for Messages in a Poison Queue

Die Behandlung nicht verarbeitbarer Nachrichten ist nicht damit beendet, dass eine Nachricht in die Warteschlange für potenziell schädliche Nachrichten eingefügt wird.Poison-message handling does not end when a message is placed in the poison-message queue. Die Nachrichten in der Warteschlange für potenziell schädliche Nachrichten müssen immer noch gelesen und behandelt werden.Messages in the poison-message queue must still be read and handled. Beim Lesen von Nachrichten aus der endgültigen Warteschlange für potenziell schädliche Nachrichten können Sie eine Teilmenge der Einstellungen zur Behandlung nicht verarbeitbarer Nachrichten verwenden.You can use a subset of the poison-message handling settings when reading messages from the final poison subqueue. Die anwendbaren Einstellungen sind ReceiveRetryCount und ReceiveErrorHandling.The applicable settings are ReceiveRetryCount and ReceiveErrorHandling. Sie können ReceiveErrorHandling auf "Drop", "Reject" oder "Fault" festlegen.You can set ReceiveErrorHandling to Drop, Reject, or Fault. MaxRetryCycles wird ignoriert, und es wird eine Ausnahme ausgelöst, wenn ReceiveErrorHandling auf "Move" festgelegt wird.MaxRetryCycles is ignored and an exception is thrown if ReceiveErrorHandling is set to Move.

Unterschiede zwischen Windows Vista, Windows Server 2003 und Windows XPWindows Vista, Windows Server 2003, and Windows XP Differences

Wie bereits oben erwähnt, sind in Windows Server 2003Windows Server 2003 und Windows XPWindows XP nicht alle Einstellungen für die Behandlung nicht verarbeitbarer Nachrichten anwendbar.As noted earlier, not all poison-message handling settings apply to Windows Server 2003Windows Server 2003 and Windows XPWindows XP. Die folgenden Hauptunterschiede zwischen dem Message Queuing in Windows Server 2003Windows Server 2003, Windows XPWindows XP und Windows VistaWindows Vista sind für die Behandlung nicht verarbeitbarer Nachrichten relevant:The following key differences between Message Queuing on Windows Server 2003Windows Server 2003, Windows XPWindows XP, and Windows VistaWindows Vista are relevant to poison-message handling:

  • Message Queuing in Windows VistaWindows Vista unterstützt untergeordnete Warteschlangen, während Windows Server 2003Windows Server 2003 und Windows XPWindows XP keine untergeordneten Warteschlangen unterstützen.Message Queuing in Windows VistaWindows Vista supports subqueues, while Windows Server 2003Windows Server 2003 and Windows XPWindows XP do not support subqueues. Untergeordnete Warteschlangen werden zur Behandlung nicht verarbeitbarer Nachrichten verwendet.Subqueues are used in poison-message handling. Die Wiederholungswarteschlangen und die Warteschlange für potenziell schädliche Nachrichten sind untergeordnete Warteschlangen der Anwendungswarteschlange, die basierend auf den Einstellungen für die Behandlung nicht verarbeitbarer Nachrichten erstellt wird.The retry queues and the poison queue are subqueues to the application queue that is created based on the poison-message handling settings. Die Eigenschaft MaxRetryCycles bestimmt, wie viele untergeordnete Wiederholungwarteschlangen erstellt werden sollen.The MaxRetryCycles dictates how many retry subqueues to create. Deshalb werden bei der Ausführung unter Windows Server 2003Windows Server 2003 oder unter Windows XPWindows XP die MaxRetryCycles ignoriert, und ReceiveErrorHandling.Move wird nicht zugelassen.Therefore, when running on Windows Server 2003Windows Server 2003 or Windows XPWindows XP, MaxRetryCycles are ignored and ReceiveErrorHandling.Move is not allowed.

  • Message Queuing in Windows VistaWindows Vista unterstützt die negative Bestätigung, während Windows Server 2003Windows Server 2003 und Windows XPWindows XP dies nicht tun.Message Queuing in Windows VistaWindows Vista supports negative acknowledgment, while Windows Server 2003Windows Server 2003 and Windows XPWindows XP do not. Eine negative Bestätigung vom empfangenden Warteschlangen-Manager bewirkt, dass der sendende Warteschlangen-Manager die abgelehnte Nachricht in die Warteschlange für unzustellbare Nachrichten einstellt.A negative acknowledgment from the receiving queue manager causes the sending queue manager to place the rejected message in the dead-letter queue. Damit ist ReceiveErrorHandling.Reject in Windows Server 2003Windows Server 2003 und Windows XPWindows XP nicht zulässig.As such, ReceiveErrorHandling.Reject is not allowed with Windows Server 2003Windows Server 2003 and Windows XPWindows XP.

  • Message Queuing in Windows VistaWindows Vista unterstützt eine Nachrichteneigenschaft, die zählt, wie oft die Nachrichtenzustellung versucht wird.Message Queuing in Windows VistaWindows Vista supports a message property that keeps count of the number of times message delivery is attempted. Diese Abbruchanzahleigenschaft ist in Windows Server 2003Windows Server 2003 und Windows XPWindows XP nicht verfügbar.This abort count property is not available on Windows Server 2003Windows Server 2003 and Windows XPWindows XP. WCF verwaltet die abbruchanzahl im Arbeitsspeicher, daher ist es möglich, dass diese Eigenschaft nicht auf einen genauen Wert enthalten kann, wenn dieselbe Nachricht von mehr als ein WCF-Dienst in einer Farm gelesen wird.WCF maintains the abort count in memory, so it is possible that this property may not contain an accurate value when the same message is read by more than one WCF service in a farm.

Siehe auchSee Also

WarteschlangenübersichtQueues Overview
Unterschiede zwischen den Warteschlangenfunktionen in Windows Vista, Windows Server 2003 und Windows XPDifferences in Queuing Features in Windows Vista, Windows Server 2003, and Windows XP
Angeben und Behandeln von Fehlern in Verträgen und DienstenSpecifying and Handling Faults in Contracts and Services