2010-12-16 11 views
1

Nun, ich mache dieses NServiceBus-Projekt für eine Weile und sobald ich es für PubSub arbeiten konnte, verbrachte ich den Rest der Zeit mit der eigentlichen Workflow-Logik. Allerdings kann ich ein ernstes Problem sehen, das ich umgehen möchte (oder vielmehr lernen, wie man richtig umgeht).NServiceBus pub/sub - wo sind meine Nachrichten hin?

Ein Verleger veröffentlicht eine Nachricht an die Speicherwarteschlangen von Abonnenten, soweit ich es verstehe. Groß. Aber was passiert, wenn der Abonnent nicht läuft (ich habe andere Beiträge darüber gelesen und sie scheinen nicht dieselbe Frage zu stellen).

Szenario - Ich bekomme den Publisher, eine Nachricht zu veröffentlichen, wenn keine Abonnenten laufen (angefügte/angeforderte Nachrichten an sie weitergeleitet werden) .. Ich finde dann, dass .. die Nachricht "weg" einfach einfach nicht da ist ! wo ist es hin? Hat der Herausgeber gesagt "Hey, niemand abonniert das, also werde ich es nicht veröffentlichen?", Sollte es das NICHT tun und mindestens einen Abonnenten benötigen?

Kann jemand Licht darauf werfen? (nservicenewbie)

+0

Also von dem, was ich bisher verstehe - es ist nicht unbedingt ein Fehler für keine Abonnenten "angefügt werden". In meinem realen Lebensszenario müssen Sie jedoch den Publisher (der Nachrichten liest, um ihn zu veröffentlichen) und dann den Abonnenten starten. Bevor die Abonnenten beginnen, könnte der Herausgeber eine Reihe von Nachrichten veröffentlicht haben! also .. diese sind im Grunde verloren und Workflow-Aktionen "gefangen" in einigen "in Arbeit" Status. Ich könnte die Publish-Methode von nServiceBus ändern .. aber ich will wirklich nicht .. – MRAH

Antwort

4

Sie sollten ein Ereignis veröffentlichen, das passiert ist - eine Tatsache, an der andere Handler interessiert sein könnten oder nicht. Es ist perfekt gültig für null Abonnenten! Wenn dies nicht der Fall ist, sollten Sie vielleicht einen Befehl senden(), anstatt ein Ereignis zu veröffentlichen().

Wenn Sie einen persistenten Subskriptionsspeicher verwenden, starten Sie den Subskribenten einmal und er wird immer abonniert. Wenn der Abonnent offline ist, stapeln sich Nachrichten für ihn in seiner Eingabewarteschlange, bereit zur Verarbeitung, wenn der Abonnent wieder online ist.

Wenn Sie nur mit NServiceBus testen, wird NServiceBus.Host.exe im Lite-Profil ausgeführt, das speicherinterne (nicht persistente) Subskriptionsspeicher verwendet, die zu dem führen, was Sie sehen.

+0

Danke für den David - wie kann ich feststellen, ob die Host-Exe im Lite-Profil läuft? – MRAH

+0

Auf Ihren Punkt über die Send-Methode - ja, es klingt wie ich Send verwenden sollte. Wenn Sie jedoch sagen, dass diese veröffentlichten Nachrichten im Nicht-Lite-Modus einfach in der Warteschlange aufgebaut werden, wenn der Abonnent (lokal) offline ist, sollte dieser Ansatz in Ordnung sein. – MRAH

+0

Das Profil wird über Befehlszeilenargumente ausgewählt.Wenn Sie keine angeben, ist Lite der Standard. Siehe http://www.nservicebus.com/Profiles.aspx –

3

Ah ha! Obwohl es nicht immer ein Fehler ist, keinen Abonnenten für einen Nachrichtentyp zu haben, gibt es einen Weg, damit umzugehen.

In Ihrem Publisher einfach das ändern:

IBus Bus 

verwenden (Sie müssen NServiceBus.Core.dll und die NS NServiceBus.Unicast):

IUnicastBus Bus 

Dann können Sie einen Handler anhängen zu:

Bus.NoSubscribersForMessage += ....... 

Das kann dann die Nachricht in eine Fehlerwarteschlange stellen .. oder vielleicht für immer versuchen .. oder veröffentlichen s etwas anderes etc .. etc .. was auch immer Sie wollen. Auf diese Weise wird sichergestellt, dass nichts verloren geht, wenn Ihr bestimmtes System (aus geschäftlicher Sicht) ein Ergebnis benötigt.