So überwachen Sie ein lang laufendes Programm programmgesteuert

11

Was ich aktuell habe, kann mit diesem Pseudocode zusammengefasst werden:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

Dieses Programm wird nur als geplante Aufgabe auf unserem Server eingerichtet. Wir besitzen das Programm und können damit machen, was wir wollen. Meine Frage stammt aus einem Blog über automatisierte Überwachungsprüfungen (ich habe keinen Link zur Hand).

Das brachte mich zum Nachdenken: Wie in aller Welt kann ich mein Programm so ändern, dass ich ein anderes "Überwachungs" -Programm starten kann? Oder sollte sich dies von einem Konsolenprogramm zu einem versteckten WPF- Programm ändern ?

Insgesamt würde ich es vorziehen, nur ein Programm auf meinem Computer ausführen zu können, das den Fortschritt des Programms über das Netzwerk überprüft, sodass ich kein RDP auf dem Server durchführen muss, um den Status zu überprüfen (dies wäre jedoch nicht der Fall) das Ende der Welt sein).

Insgesamt würde ich gerne ein Fenster sehen, in dem etwa Folgendes steht: Prozess x von y Bisher werden die folgenden Elemente verarbeitet. Listen Sie die Elemente in einer Tabelle auf und lassen Sie sie wie "Hochladen" oder "Warten auf Antwort" sagen. Vielleicht könnte ich, wenn ich verrückt werde, auch eine Warteschlange mit fehlgeschlagenen Gegenständen erstellen (aber das wäre nur extra).

Mein Geist neigt immer wieder zu einem Ereignis, aber ich kann nicht herausfinden, wie ich ein Programm ausführen würde, das ein laufendes Programm abonnieren und abbestellen kann. Ist das überhaupt möglich?

Robert Snyder
quelle
Möchten Sie den Fortschritt innerhalb der (10 Minuten dauernden) Upload- / Antwortvorgänge überwachen oder möchten Sie wissen, wie viele Uploads in der "Parallel.ForEach" -Schleife stattgefunden haben?
Doc Brown
@DocBrown siehe bearbeiten. (letzte zwei Absätze)
Robert Snyder
1
Klingt für mich so, als ob Sie vielleicht ein einfaches UDP-Empfängerprogramm wollen. Sie können Statuspakete im Netzwerk ablegen, und wenn dort nichts zum Empfangen vorhanden ist, wird kein Schaden angerichtet.
Robert Harvey

Antworten:

7

Was Sie brauchen, ist eine Möglichkeit, zwischen Ihren Programmen zu kommunizieren, die sie nicht miteinander verbindet. Es gibt eine Reihe von Möglichkeiten, dies zu tun. Sie können die Aufgabe in eine Datei schreiben lassen und das Lesen aus der Datei überwachen, die Aufgabe über WCF verfügbar machen, damit der Monitor nach Änderungen suchen kann, das Netzwerk verwenden ...

Um eine Neuerfindung des Rads zu vermeiden, werfen Sie einen Blick auf die Protokollierungsziele von log4net. Wenn ich so etwas implementieren würde, würde ich wahrscheinlich log4net verwenden und mich bei UDP oder Telnet anmelden und den Monitor am anderen Ende mit ihm verbinden. log4net kümmert sich um alles für Sie, einschließlich des Auslösens von Ausnahmen, wenn kein Monitor aktiv ist.

JDT
quelle
Ich denke, ich bin begeistert von dieser Antwort, weil wir log4net bereits gut nutzen .. logging :) Das würde also gut zu dem passen, was er hat. Ich hatte keine Ahnung, dass log4net dies tun könnte! Vielen Dank
Robert Snyder
9

Aus Ihren Kommentaren geht hervor, dass Sie eine Client / Server-Datenbank zur Verfügung haben und Ihr Uploader bereits eine Verbindung und einen Schreibzugriff hat. Dann wäre es wahrscheinlich am einfachsten, der Datenbank eine "Überwachungs-" oder "Statustabelle" hinzuzufügen und Ihren Uploader dort seinen Fortschritt melden zu lassen (protokollieren Sie dort jeden "interessanten" Schritt, wahrscheinlich die 5 oben aufgeführten Schritte).

Um den Status anzuzeigen, erstellen Sie ein zweites Programm mit GUI, das eine Verbindung zur Datenbank herstellt und den Status anzeigt (z. B. durch Abfragen in Intervallen von 1 Minute). Sie können dieses Programm auf Ihrem lokalen Desktop ausführen, vorausgesetzt, es ist möglich, von dort aus eine Verbindung zur Datenbank herzustellen.

Wenn Sie in eine Statustabelle schreiben und Ihre Datenbanktransaktionen stören, können Sie natürlich eine separate Verbindung verwenden. Sie können auch einen Nachrichtenwarteschlangenmechanismus wie MSQM verwenden , dies könnte jedoch eine übergroße Lösung für Ihren einfachen Fall sein.

Doc Brown
quelle
+1 Dies ist der beste Ansatz, um es einfach zu halten und etwas nicht zu komplizieren, das nicht zu komplex sein sollte.
Thomas Stringer
3

Um auf der Antwort von @ JDT aufzubauen, schreiben Sie häufig Nachrichten in eine Nachrichtenwarteschlange. Wenn in Ihrer Anwendung etwas Wichtiges passiert, wird eine Nachricht geschrieben und an die Nachrichtenwarteschlange gesendet. Normalerweise ist das Format der Nachricht XML oder ähnlich. Es ist der Warteschlangenschreiber.

Die Überwachungsanwendung liest (Warteschlangenleser) die Warteschlange und wählt die Nachrichten aus und verarbeitet sie, indem sie sie speichert und die Nachricht im Vergleich zu früheren Nachrichten oder Bedingungen analysiert. Wenn eine Bedingung erfüllt ist, gibt die Überwachungsanwendung eine Warnung aus, die auf ein potenzielles Problem hinweist.

Dies entkoppelt Ihre Anwendung von der Überwachung selbst, da nur Nachrichten abgefeuert werden. Es liegt an der Überwachungsanwendung, anhand der aktuellen Nachrichten zu bestimmen, ob etwas Gutes oder Schlechtes passiert ist. Warteschlangen werden verwendet, weil sie eine gute Möglichkeit bieten, die Nachrichten ohne Verlust zu speichern.

Sie möchten das Messaging zentralisieren, wenn mehrere Instanzen Ihrer Anwendung ausgeführt werden. Wenn nur eine Instanz vorhanden ist, kann die Verwendung anderer Speicher wie des Windows-Ereignisprotokolls oder einer Datei ausreichend sein.

Jon Raynor
quelle