Frage

Ist es möglich, mehrere Zuhörer auf Nachrichten von MSMQ ausgeführt haben?

WCF erscheint in Bezug auf Dienstleistungen alles zu gestalten, so dass die Kommunikation einen Punkt-zu-Punkt-Affäre. Ich möchte eine Nachrichtenwarteschlange verwenden eingehenden Datenverkehr für einen anderen Prozess zu puffern, die die Protokolle in einer Datenbank erfasst.

Es kann eine beliebige Anzahl von anderen Prozessen sein interessieren eingehenden Datenverkehr überwachen und das wirft positiv für Beobachter-Muster, aber ich kann nicht sehen, wie Beobachter-Muster zum Ausdruck zu bringen, zumindest nicht MSMQ über WCF verwenden.

Kann jemand mir raten, auf das?


Einige Hintergrundinformationen darüber, warum ist mir egal, was auch das Problem zu veranschaulichen, kann dazu dienen: Ich habe einen Windows-Dienst, die Verbindungsanforderungen von kleinen schwarzen Boxen auf dem Gebiet akzeptiert. Es richtet Steckdosen und die schwarzen Boxen senden Nachrichten Ereignisse kommentierten mit GPS-Positionen in Raum und Zeit zu beschreiben.

analysieren I Nachrichtenpakete aus der Steckdose Strom und senden sie über MSMQ an einen anderen Prozess, die Duplikate und schreibt die Pakete in einer Datenbanktabelle filtert.

Es gibt jede Menge von Nachverarbeitung, die von inkrementeller Berechnung als Reaktion auf eingehenden Datenverkehr profitieren würde, und die Anwenderprogramme Benutzerbenachrichtigung auch als Reaktion auf eingehenden Datenverkehr durchführen.

So, würde Ich mag ein Verfahren haben, um die Nachrichten zu senden, und einige davon zu empfangen. Einer dieser Empfänger ist verantwortlich für den Paketinhalt Parsen und die Nachricht in eine Datenbank zu transkribieren; Dies ist ein offensichtlicher Kandidat für die Verantwortung der schließlich die Nachricht aus der Warteschlange zu entfernen, aber es ist die Frage, wie sichergestellt wird dies der letzte Handler ist die Nachricht zu verarbeiten.

War es hilfreich?

Lösung

Ich glaube nicht, MSMQ angemessen, diese Situation ausgelegt ist, von selbst zu handhaben. Es gibt nur 2 Dinge, die Sie auf eine Nachricht tun können - Peek () oder Get (). AFAIK gibt es keine guten Weg, zu verfolgen, ob eine Nachricht von allen Handler verarbeitet worden war.

Was könnte, ist arbeiten, um Ihren Prozess zu haben, dass die Nachricht die Beobachteten sein transkribiert, und die Nachricht zu veröffentlichen, um alle interessierten Beobachter (vielleicht die .NET Eventarchitektur verwenden), bevor die Nachricht zu transkribieren und in die Datenbank zu schreiben. Dies würde eine Garantie bieten, dass alle interessierten Beobachter die Nachricht sah, und die Nachricht entsprechend auf die DB geschrieben wird.

Andere Tipps

Ich glaube, Sie brauchen einen Publish-Subscribe-Kanal :

  

Wie kann der Sender ausgestrahlt ein Ereignis an alle interessierten Empfänger?    Senden Sie die Veranstaltung auf einem Publish-Subscribe-Kanal, der eine Kopie eines bestimmten liefert   Ereignis zu jedem Empfänger.

     

Ein Kanal Publish-Subscribe funktioniert wie folgt: Es hat einen Eingangskanal   daß aufteilt in mehrere Ausgangskanäle, einen für jeden Teilnehmer.   Wenn ein Ereignis in den Kanal veröffentlicht wird, die Publish-Subscribe   Kanal liefert eine Kopie der Nachricht an jeden der Ausgangskanäle.   Jeder Ausgangskanal hat nur einen Teilnehmer, der nur erlaubt ist,   verbrauchen einmal eine Nachricht. Auf diese Weise wird nur jeder Teilnehmer erhält die   einmal Nachricht und verbraucht Kopien verschwinden aus ihren Kanälen.

Dieses Muster wird auf der MSMQ implementiert von Masstransit und NServiceBus .

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