Frage

Ich bin gerade erst mit nServicegebühren Bus zu spielen und ich versuche, die Veröffentlichung zum Laufen zu bringen. Ich habe einen Zuhörer, die einige Nachrichten zu fehlen scheint. Es ist so konfiguriert, mit

 <MsmqTransportConfig
  InputQueue="InformMessages"
  ErrorQueue="error"
  NumberOfWorkerThreads="5"
  MaxRetries="5"
 />

Interessanterweise, wenn ich NumberOfWorkerThreads auf 1 gesetzt vermisst es konsequent jede andere Nachricht. Für größere Werte scheint es weniger bestimmt. In meinem Nachrichtenhandler Ich habe

class MessageHandler : IMessageHandler<ICourseRegister>
{
    public void Handle(ICourseRegister message)
    {
        Console.WriteLine("Message dun got gotted");
        Console.WriteLine("Course name is: " + message.CourseName);
    }

    private IBus bus;
    public IBus Bus
    {
        set { this.bus = value; }
    }
}

und der Bus so konfiguriert ist, mit

        var bus = NServiceBus.Configure.With()
              .SpringBuilder()
              .XmlSerializer()
              .MsmqTransport()
                  .IsTransactional(true)
                  .PurgeOnStartup(false)
              .UnicastBus()
                  .ImpersonateSender(false)
                  .LoadMessageHandlers()
              .CreateBus()
              .Start();

Gibt es etwas, was ich tun müssen, und das Ende des Handler, so dass sie bereit freigegeben wird, um die nächste Nachricht oder eine Konfiguration, die ich so tun muß, erhalten, dass es eine Client-Seite Warteschlange Nachrichten zu behalten, wenn die Prozedur beschäftigt ist. Die Zeit zwischen dem Senden von Nachrichten scheint keine Rolle zu, könnte es 20 Sekunden sein, und die Zuhörer noch nicht alle Nachrichten nicht erhalten.

War es hilfreich?

Lösung

Nach einem Blick auf die Lösung nehmen Sie geschickt, ich sehe, was das Problem ist.

Sie haben die gleiche Eingangswarteschlange für beide Prozesse spezifiziert - den Verleger und den Abonnenten. Als Ergebnis haben Sie beiden Prozesse über die Nachrichten zu kämpfen, die (glaube ich) Sie beabsichtigen, nur an die Teilnehmer zu gehen.

Geben Sie jeden Prozess eine eigene Eingabewarteschlange und alles soll mit der Welt richtig sein: -)

Andere Tipps

Wenn Sie arbeiten ähnlich wie die Pub / Sub Probe, was Sie konnte sehen, ist „polymorphe Abonnements“.

Im pub / sub Probe, der Herausgeber veröffentlicht abwechselnd eine Schnittstelle IEvent und eine konkrete Klasse Eventmessage (die erben IEvent).

Wenn ein Teilnehmer auf die konkrete Klasse gezeichnet wird, dann wird es nicht die Schnittstelle Nachrichten empfangen. Dies gilt für alle Arten von Hierarchien, wenn Sie auf die spezifische Klasse zu abonnieren, und der Verlag veröffentlicht eine Meldung der Art ihrer Basisklasse, wird die Nachricht nicht versendet werden.

Die polymorphen Abonnements funktioniert umgekehrt. Wenn Sie die Basisstation anmelden, jede Unterklasse, die der Verlag ankommen veröffentlicht.

Das hat nichts mit Threading zu tun.

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top