Ich habe eine NServiceBus-Anwendung, für die eine bestimmte Nachricht möglicherweise aufgrund eines externen Ereignisses nicht verarbeitet werden kann. Da dieses andere Ereignis kein NSB-Ereignis ist, kann ich sagas nicht ordnungsgemäß implementieren.NServiceBus verzögerte Nachrichtenverarbeitung
Anstatt die Nachricht einfach neu einzureihen (was eine Schleife verursachen würde, bis dieses externe Ereignis aufgetreten ist), wickle ich die Nachricht in eine andere Nachricht (DelayMessage) und stehe stattdessen in die Warteschlange. Die DelayMessage wird von einem anderen Dienst abgerufen und in einer Datenbank gespeichert, bis das Wiederholungsintervall abläuft. An diesem Punkt reiht der Verzögerungsdienst die Nachricht in der ursprünglichen Warteschlange erneut ein, so dass ein weiterer Versuch unternommen werden kann.
Dies kann jedoch mehr als einmal passieren, wenn das externe Ereignis noch nicht stattgefunden hat, und in dem Fall, dass das nie passiert, möchte ich die Anzahl der Rundreisen der Nachricht begrenzen. Dies bedeutet, dass DelayMessage eine MaxRetries-Eigenschaft besitzt, die jedoch verloren geht, wenn der Verzögerungsdienst die ursprüngliche Nachricht für die Wiederholung in die Warteschlange stellt.
Welche anderen Optionen vermisse ich? Ich bin glücklich zu akzeptieren, dass es eine völlig andere Lösung für dieses Problem gibt.
Wow der Mann selbst - danke! Ich kann eine Saga nicht wirklich benutzen, glaube ich nicht. Es gibt nur eine Nachricht, und sie benötigt einige Daten in der Datenbank, bevor sie verarbeitet werden kann. Es gibt nicht wirklich zwei Nachrichten, die ich zu einer Saga zusammenstellen kann, die Daten werden von einer gespeicherten Legacy-Prozedur erstellt, ich verwende NSB, um zusätzliche Daten hinzuzufügen, die darauf verweisen. –
Verwenden Sie dann das Timeout in der Saga, um zu prüfen, ob sich Daten in der Datenbank befinden - es bietet Ihnen einen einfachen Abfragemechanismus; keine Daten, fordern Sie ein anderes Timeout an. –