Come monitorare a lungo un programma a esecuzione prolungata

11

Quello che ho attualmente può essere riassunto con questo pseudo codice:

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)
}

Questo programma è appena configurato sul nostro server come operazione pianificata. Possediamo il programma e possiamo fare ciò che vogliamo con esso. La mia domanda deriva da un blog sulla creazione di controlli di monitoraggio automatici (non ho un collegamento a portata di mano).

Quindi questo mi ha fatto pensare: come posso modificare il mio programma in modo da poter attivare un altro programma di "monitoraggio"? O questo dovrebbe cambiare da programma per console a dire un programma WPF che è nascosto?

Nel complesso, preferirei essere in grado di eseguire solo un programma sul mio computer che controlla l'avanzamento del programma attraverso la rete, quindi non devo RDP nel server per controllarne lo stato (ma non sarebbe la fine del mondo).

In generale, suppongo che mi piacerebbe vedere una finestra che dice qualcosa come: Processo x di y finora, i seguenti elementi sono in fase di elaborazione. Elenca gli articoli in, come, una tabella e chiedi loro come "Caricamento" o "In attesa di risposta". Forse se impazzisco potrei anche vedere come una coda di elementi falliti (ma sarebbe solo extra).

La mia mente continua a orientarsi verso un evento, ma non riesco a capire come eseguirò un programma che può iscriversi e disiscriversi a un programma in esecuzione. È persino possibile?

    
posta Robert Snyder 24.04.2015 - 15:28
fonte

3 risposte

7

Ciò di cui hai bisogno è un modo per comunicare tra i tuoi programmi che non li legano tra loro. Esistono diversi modi per eseguire questa operazione, l'attività può essere scritta su un file e deve essere controllata la lettura dal file, rendere l'attività disponibile tramite WCF in modo che il monitor possa "interrogare" le modifiche, utilizzare la rete ...

Per evitare di reinventare la ruota, dai un'occhiata agli obiettivi di registrazione log4net se dovessi implementare qualcosa del genere probabilmente userei log4net e collegarmi a UDP o Telnet e avere il monitor dall'altra parte collegarsi ad esso. log4net si prende cura di tutto per te, incluso non lanciare eccezioni quando non è attivo alcun monitor.

    
risposta data 24.04.2015 - 16:13
fonte
9

Dai tuoi commenti vedo che hai un database client / server disponibile e che l'utente che hai caricato ha già una connessione e accesso in scrittura? Quindi sarebbe probabilmente più semplice aggiungere una tabella di "monitoraggio" o "stato" al database e lasciare che il tuo uploader riferisca i suoi progressi lì (registra ogni passo "interessante" lì, probabilmente i 5 passaggi che hai elencato sopra).

Per visualizzare lo stato, creare un secondo programma con GUI, che si connette al database e visualizza lo stato (ad esempio, eseguendo il polling a intervalli di 1 minuto). È possibile eseguire quel programma sul desktop locale, presupponendo che sia possibile connettersi al database da lì.

Naturalmente, quando si scrive in una tabella di stato si interviene con le transazioni del database, è possibile utilizzare una connessione separata. È inoltre possibile utilizzare un meccanismo di coda dei messaggi come MSQM per questo, ma potrebbe essere una soluzione di grandi dimensioni per il tuo caso semplice.

    
risposta data 24.04.2015 - 16:16
fonte
3

Solo per costruire la risposta di @ JDT, un modo comune per farlo è scrivere messaggi in una coda di messaggi. Ogni volta che succede qualcosa di importante nella tua applicazione, scrive un messaggio e lo invia alla coda dei messaggi. In genere il formato del messaggio è XML o simile. È lo scrittore di code.

L'applicazione di monitoraggio legge (coda il lettore) la coda e preleva i messaggi e li elabora salvandoli e analizzando il messaggio rispetto a messaggi o condizioni precedenti. Se viene soddisfatta una condizione, l'applicazione di monitoraggio genera un avviso che indica un potenziale problema.

Questo disaccoppia l'applicazione dal monitoraggio stesso in quanto sta semplicemente sparando messaggi. Spetta all'applicazione di monitoraggio determinare in base ai messaggi correnti che è successo qualcosa di buono o di cattivo. Le code vengono utilizzate perché offrono un buon mezzo per archiviare i messaggi senza perdita.

Si desidera la messaggistica centralizzata se sono in esecuzione più istanze dell'applicazione. Se è presente solo 1 istanza, è possibile utilizzare altri negozi come il registro eventi di Windows o un file.

    
risposta data 24.04.2015 - 16:27
fonte

Leggi altre domande sui tag