Nachricht wird nur aus der Warteschlange entfernt, wenn der Benutzer einen Vorgang ausführt

StackOverflow https://stackoverflow.com/questions/1370096

  •  21-09-2019
  •  | 
  •  

Frage

Wir haben eine MVC-Anwendung, die Daten von MSMQ liest.Wir versuchen, eine Möglichkeit zu finden, Nachrichten nur dann aus der Warteschlange zu lesen und aus der Warteschlange zu entfernen, wenn der Benutzer einen erfolgreichen Vorgang in der Warteschlange ausgeführt hat.Die Nachricht sollte in der Warteschlange bleiben, bis der Benutzer die Verarbeitung abgeschlossen hat. Die Nachricht sollte für niemanden anderen verfügbar sein, bis der Benutzer, der das Nachrichtenobjekt verarbeitet, den Vorgang abgeschlossen hat.

Gibt es eine Eigenschaft für ein Nachrichtenobjekt, die als „Peeked“ festgelegt werden kann und die das erneute Lesen dieser Nachricht erst dann zulässt, wenn sie wieder in die Warteschlange gestellt oder aus der Warteschlange entfernt wird?

Wir sind uns nicht sicher, ob die Verwendung von MSMQ in diesem Fall eine gute Idee ist?

War es hilfreich?

Lösung

Es hört sich so an, als müssten Sie Ihre Warteschlange(n) im Transaktionsmodus verwenden.Anschließend kann Ihr Kunde eine Nachricht empfangen, verarbeiten und Dann Übertragen Sie die Transaktion, woraufhin die Nachricht endgültig aus der Warteschlange entfernt wird.Während die Transaktion aktiv ist, sehen andere Clients die Nachricht jedoch nicht – sie wird in Reserve gehalten, bis die Transaktion abgeschlossen oder abgebrochen wird.

Dieser MSDN-Artikel bietet einen guten Überblick über Nutzungsmuster für zuverlässiges Messaging mit MSMQ:

http://msdn.microsoft.com/en-us/library/ms978430.aspx

Andere Tipps

Die Queue ist die richtige Idee. Ihr Ansatz von „lassen Sie es in der Warteschlange, verschlossen, aber noch Art-of-verfügbar“ ist falsch.

Sie können mehrere Warteschlangen müssen.

  1. Prozess A Enqueues etwas in Warteschlange 1

  2. Prozess B entnimmt aus Queue 1 und beginnt zu arbeiten.

    • Wenn B erfolgreich ist, das ist es.

    • Ansonsten wird es woanders Warteschlange (vielleicht die gleiche Warteschlange, oder vielleicht Queue 2) für Nacharbeiten.

Wenn es in Warteschlange 1 geht zurück, B wird es wieder finden, schließlich. Wenn es auf eine andere Warteschlange ging, dann tut ein anderer Prozess Bereinigung, Logging, Fehler Fixup oder was auch immer, vielleicht etwas zurück in der Warteschlange mit 1.

Eine Queue ist keine Datenbank - es gibt nichts Stateful (kein „Blick auf mich nicht, ich bin gerade verarbeitet“)

.

Eine Queue ist die vorübergehende Speicherung. Jemand schreibt, jemand anderes liest, und das ist es.


Wenn Sie Zuverlässigkeit wollen, lesen Sie: http://msdn.microsoft .com / en-us / library / ms978430.aspx

Und: http: //blogs.msdn. com / shycohen / Archiv / 2006/02/20 / 535717.aspx

Und: http: //www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

Die Zuverlässigkeit ist ein Merkmal der Warteschlange, nicht Ihre Anwendung. Sie können eine „behebbaren Lese“ tun. Es ist eine Transaktion, die Teil der Warteschlangen API ist.

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