Comment surveiller un programme de longue durée par programme


11

Ce que j'ai actuellement peut être résumé avec ce pseudo code:

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

Ce programme est simplement configuré sur notre serveur comme une tâche planifiée. Nous sommes propriétaires du programme et pouvons en faire ce que nous voulons. Ma question provient d'un blog sur la réalisation de contrôles de surveillance automatisés (je n'ai pas de lien à portée de main).

Cela m'a donc fait réfléchir: comment diable puis-je modifier mon programme pour lancer un autre programme de "surveillance"? Ou devrait-il changer d'être un programme de console pour dire un programme WPF qui est caché?

Dans l'ensemble, je préférerais pouvoir simplement exécuter un programme sur mon ordinateur qui vérifie la progression du programme via le réseau, donc je n'ai pas besoin de RDP sur le serveur pour vérifier son état (mais il ne le ferait pas être la fin du monde).

Dans l'ensemble, je suppose que j'aimerais voir une fenêtre qui dit quelque chose comme: Traiter x de y jusqu'à présent, les éléments suivants sont en cours de traitement. Faites la liste des éléments dans un tableau, par exemple, et demandez-leur de dire "Téléchargement" ou "En attente de réponse". Peut-être que si je devenais fou, je pourrais aussi comment une file d'attente d'articles en échec (mais ce serait juste un supplément).

Mon esprit continue de pencher vers un événement, mais je n'arrive pas à comprendre comment je pourrais exécuter un programme qui peut s'abonner et se désinscrire d'un programme en cours d'exécution. Est-ce seulement possible?


Voulez-vous surveiller la progression dans les opérations de téléchargement / réponse (d'une durée de 10 minutes), ou voulez-vous savoir combien de téléchargements ont eu lieu dans la boucle "Parallel.ForEach"?
Doc Brown

@DocBrown voir éditer. (deux derniers paragraphes)
Robert Snyder

1
Pour moi, ce que vous voulez est peut-être un simple programme récepteur UDP. Vous pouvez supprimer des paquets d'état sur le réseau, et s'il n'y a rien pour les recevoir, aucun mal n'est fait.
Robert Harvey

Réponses:


7

Ce dont vous avez besoin est un moyen de communiquer entre vos programmes qui ne les lie pas les uns aux autres. Il existe plusieurs façons de le faire, vous pouvez demander à la tâche d'écrire dans un fichier et surveiller la lecture du fichier, rendre la tâche disponible via WCF afin que le moniteur puisse `` interroger '' les modifications, utiliser le réseau ...

Pour éviter de réinventer la roue, jetez un œil aux cibles de journalisation de log4net.Si je devais implémenter quelque chose comme ça, j'utiliserais probablement log4net et me connecter à UDP ou Telnet et faire connecter le moniteur à l'autre extrémité. log4net s'occupe de tout pour vous, y compris de ne pas lever d'exceptions quand aucun moniteur n'est actif.


Je pense que je suis prêt à aller avec cette réponse parce que nous utilisons déjà log4net pour bien .. la journalisation :) Donc, cela correspondrait bien à ce qu'il a. Je n'avais aucune idée que log4net pouvait faire ça! Merci
Robert Snyder

9

D'après vos commentaires, je vois que vous avez une base de données client / serveur disponible, et que votre uploader a déjà une connexion et un accès en écriture? Ensuite, il serait probablement plus facile d'ajouter une table de "surveillance" ou "d'état" à la base de données et de laisser votre téléchargeur y signaler sa progression (enregistrez-y chaque étape "intéressante", probablement les 5 étapes que vous avez énumérées ci-dessus).

Pour afficher l'état, créez un deuxième programme avec GUI, qui se connecte à la base de données et affiche l'état (par exemple, en interrogeant à des intervalles de 1 minute). Vous pouvez exécuter ce programme sur votre bureau local, en supposant qu'il est possible de se connecter à la base de données à partir de là.

Bien sûr, lorsque l'écriture dans une table d'état interfère avec vos transactions de base de données, vous pouvez utiliser une connexion distincte. Vous pouvez également utiliser un mécanisme de file d'attente de messages comme MSQM , mais cela pourrait être une solution surdimensionnée pour votre cas simple.


+1 C'est la meilleure approche pour rester simple et ne pas compliquer excessivement quelque chose qui ne devrait pas être trop complexe.
Thomas Stringer

3

Juste pour s'appuyer sur la réponse de @ JDT, une façon courante de le faire est d'écrire des messages dans une file d'attente de messages. Chaque fois qu'un événement important se produit dans votre application, il écrit un message et l'envoie à la file d'attente de messages. En règle générale, le format du message est XML ou similaire. C'est l'auteur de la file d'attente.

L'application de surveillance lit (lecteur de file d'attente) la file d'attente et sélectionne les messages et les traite en les enregistrant et en analysant le message par rapport aux messages ou conditions antérieurs. Si une condition est remplie, l'application de surveillance déclenche une alerte indiquant un problème potentiel.

Cela dissocie votre application de la surveillance elle-même car elle ne fait que lancer des messages. Il appartient à l'application de surveillance de déterminer, sur la base des messages actuels, que quelque chose de bien ou de mal s'est produit. Les files d'attente sont utilisées car elles offrent un bon moyen de stocker les messages sans perte.

Vous souhaitez centraliser la messagerie s'il existe plusieurs instances de votre application en cours d'exécution. S'il n'y a qu'une seule instance, l'utilisation d'autres magasins comme le journal des événements Windows ou un fichier peut être suffisante.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.