MSMQ und Polling zum Empfang von Nachrichten?

8

Ich habe einen Windows Dienst , der eine Bildkonvertierung durchführt. Es funktioniert, indem man abfeuert, wenn irgendeine Datei (in einem bestimmten Ordner) umbenannt wird (dh Dateiwächter umbenennen). Funktioniert gut, bis ich eine riesige Menge Bilder in diesem Ordner abgelegt (und umbenannt) habe. CPU Redlines, etc ..

Also wollte ich meinen Code ändern, um MSMQ zu verwenden, um alle Dateien, die konvertiert werden müssen, in eine Warteschlange zu stellen. Fein. Jedes Mal, wenn die Datei umbenannt wird und der Dateiwatcher ausgelöst wird, füge ich der Warteschlange eine neue Nachricht hinzu. Kewl.

Problem ist das - & gt; Wie greife ich jeweils eine Nachricht aus der Warteschlange?

Muss ich ein Timer-Objekt erstellen, das die Warteschlange alle xxx Sekunden abfragt? Oder gibt es eine Möglichkeit, ständig den ersten Gegenstand in der Warteschlange zu sehen. Sobald eine Nachricht existiert, extrahiere sie, verarbeite sie und fahre fort (was bedeutet, dass du weiter spähst, bis die Welt explodiert).

Ich habe mich gefragt, ob ich nur eine While-Schleife um die Receive-Methode machen muss. Pseduo-Code ist unten (in Edit # 2) ...

Hat jemand Erfahrung damit und Anregungen?

Danke schön!

BEARBEITEN:

Wenn WCF der Weg ist, kann jemand stattdessen einen Beispielcode usw. bereitstellen?

EDIT 2:

Hier ist ein Pseudo-Code, an den ich dachte ...

%Vor%     
Pure.Krome 29.07.2009, 05:27
quelle

5 Antworten

25

Wenn Sie die lokale Warteschlange verwenden, benötigen Sie WCF nicht.

So sieht mein Beispielservice aus (ein Service-Class aus Windows-Service-Projekt):

%Vor%     
ViktorJ 29.07.2009, 06:41
quelle
1

Ich hatte den Eindruck, dass MSMQ mit IBMs MQ-Produkt kompatibel ist. Wenn dies ist der Fall, können Sie MQGET mit einer Zeitüberschreitung aufrufen und sich nicht um Abfragen kümmern.

Holen Sie einfach eine Nachricht aus der Warteschlange mit einem Timeout von zwei Sekunden (zum Beispiel). Wenn da einer war, dann bearbeite es. Beenden Sie dann den Dienst, falls gewünscht, oder wechseln Sie mit warten zu MQGET.

Dies bedeutet, dass Ihr Dienst die CPU-Zeit nicht unnötig in Anspruch nimmt, aber er kann immer noch rechtzeitig beendet werden, wenn er signalisiert wird.

Im Allgemeinen hätten Sie etwas wie:

%Vor%     
paxdiablo 29.07.2009 06:16
quelle
1

Wirf die Ereignisargumente, um deine Nachricht anstelle des Absenders zu einer neuen MessageQueue im ViktorJ Beispiel zu bekommen, sicherlich ist das effizienter? dann benutze das statische Feld mq, um mq.BeginReceive aufzurufen, ansonsten dein brennender Speicher

    
dvr 24.02.2012 22:00
quelle
0

Klingt so, als müssten Sie in WCF schauen.

Warteschlangen in Windows Communication Foundation

  

Lastausgleich. Anwendungen senden   kann empfangende Anwendungen überfordern   mit Nachrichten. Warteschlangen können verwalten   nicht übereinstimmende Nachrichtenproduktion und   Verbrauchsraten, so dass ein Empfänger   ist nicht überwältigt.

Hier finden Sie ein Beispiel mit WCF und MSMQ

    
Jonathan Parker 29.07.2009 05:33
quelle
0

Beachten Sie, dass das Servicebeispiel bei OnStart () blockiert wird. Starten Sie stattdessen einen Arbeitsthread:

%Vor%

Rufen Sie dann BeginReceive () vom Worker auf.

    
Alex Waddell 13.11.2009 20:54
quelle

Tags und Links