Meilleure façon d'exécuter des tâches planifiées [fermé]
Aujourd'hui, nous avons construit une application console pour exécuter les tâches planifiées pour notre ASP.NET site web. Mais je pense que cette approche est un peu sujette aux erreurs et difficile à maintenir. Comment exécutez-vous votre tâche planifiée (dans un environnement windows/IIS/ASP.NET)
Mise à jour:
Exemples de tâches:
- envoi d'un e-mail à partir d'une file d'attente dans la base de données
- Suppression d'objets obsolètes de la base de données
- récupérer les statistiques de Google AdWords et remplir un tableau la base de données.
16 réponses
Toutes mes tâches (qui doivent être planifiées) pour un site Web sont conservées dans le site web et appelées à partir d'une page spéciale. J'ai ensuite écrit un simple service Windows qui appelle cette page de temps en temps. Une fois la page exécutée, elle renvoie une valeur. Si je sais qu'il y a plus de travail à faire, je lance à nouveau la page, tout de suite, sinon je l'exécute dans un petit moment. Cela a très bien fonctionné pour moi et garde toute ma logique de tâche avec le code web. Avant d'écrire le service Windows simple, j'ai utilisé Windows planificateur pour appeler la page toutes les x minutes.
Une autre façon pratique d'exécuter ceci est d'utiliser un service de surveillance comme Pingdom . Pointez leur vérification http sur la page qui exécute votre code de service. Demandez à la page de renvoyer des résultats qui peuvent ensuite être utilisés pour déclencher Pingdom pour envoyer des messages d'alerte quand quelque chose ne va pas.
Cette technique de Jeff Atwood pour Stackoverflow est la méthode la plus simple que j'ai rencontrée. Il s'appuie sur le mécanisme de rappel" cache item removed " intégré ASP.NET système de cache
Update: Stackoverflow a dépassé cette méthode. Cela ne fonctionne que lorsque le site est en cours d'exécution, mais c'est une technique très simple qui est utile pour beaucoup de gens.
Consultez Également Quartz.NET
Créez un Service Windows personnalisé .
J'ai eu certaines tâches critiques configurées comme des applications de console planifiées et je les ai trouvées difficiles à maintenir. J'ai créé un service Windows avec un "rythme cardiaque" qui vérifierait un horaire dans ma base de données toutes les deux minutes. Il a travaillé vraiment bien.
Cela dit, j'utilise toujours des applications de console planifiées pour la plupart de mes tâches de maintenance non critiques. S'il n'est pas cassé, ne le Répare pas.
J'ai trouvé cela facile pour tous les participants:
- créez une méthode webservice telle que DoSuchAndSuchProcess
- créez une application console qui appelle cette webmethod.
- planifiez l'application console dans le planificateur de tâches.
En utilisant cette méthodologie, toute la logique métier est contenue dans votre application web, mais vous avez la fiabilité du Gestionnaire des tâches windows ou de tout autre gestionnaire de tâches commercial pour le lancer et enregistrer toutes les informations de retour telles qu'une rapport d'exécution. L'utilisation d'un service web au lieu de publier sur une page présente un avantage car il est plus facile d'obtenir des données de retour à partir d'un service web.
Pourquoi réinventer la roue, utilisez le Threading et la classe Timer.
protected void Application_Start()
{
Thread thread = new Thread(new ThreadStart(ThreadFunc));
thread.IsBackground = true;
thread.Name = "ThreadFunc";
thread.Start();
}
protected void ThreadFunc()
{
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
t.Interval = 10000;
t.Enabled = true;
t.AutoReset = true;
t.Start();
}
protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
{
//work args
}
Utilisez le planificateur Windows pour exécuter une page web.
Pour empêcher les araignées malicieuses des utilisateurs ou des moteurs de recherche de l'exécuter, lorsque vous configurez la tâche planifiée, appelez simplement la page web avec une chaîne de requête, c'est-à-dire : mypage.aspx?de=scheduledtask
Ensuite, dans le chargement de la page, utilisez simplement une condition : si (la Demande.Querystring["de"] == "scheduledtask") { // executetask }
De cette façon, aucune araignée de moteur de recherche ou utilisateur malveillant ne sera en mesure d'exécuter votre tâche planifiée.
Cette bibliothèque fonctionne comme un charme http://www.codeproject.com/KB/cs/tsnewlib.aspx
Il vous permet de gérer les tâches planifiées de Windows directement via votre code. net.
De plus, si votre application utilise SQL SERVER, vous pouvez utiliser L'Agent SQL pour planifier vos tâches. C'est là que nous mettons généralement du code récurrent piloté par les données (rappels par e-mail, maintenance planifiée, purges, etc...). Une grande fonctionnalité intégrée à SQL Agent est les options de notification d'échec, qui peuvent vous alerter si une tâche critique échoue.
Je ne sais pas quel genre de tâches planifiées vous voulez dire. Si vous voulez dire des choses comme " toutes les heures, rafraîchissez foo.xml " tapez tâches, puis utilisez le système de tâches planifiées Windows. (La commande "at", ou via le contrôleur.) Qu'il exécute une application console ou demande une page spéciale qui démarre le processus.
Edit: je devrais ajouter, c'est un bon moyen de faire fonctionner votre application IIS aux points planifiés aussi. Supposons donc que vous souhaitiez vérifier votre base de données toutes les 30 minutes et envoyer des rappels aux utilisateurs à propos de certains données, vous pouvez utiliser des tâches planifiées pour demander cette page et donc obtenir des choses de traitement IIS.
Si vos besoins sont plus complexes, vous pouvez envisager de créer un Service Windows et exécuter une boucle pour faire le traitement dont vous avez besoin. Cela a également l'avantage de séparer le code à des fins de mise à l'échelle ou de gestion. En revanche, vous devez traiter avec les services Windows.
Si vous possédez le serveur, vous devez utiliser le planificateur de tâches windows. Utiliser AT /? de la ligne de commande pour voir les options.
Sinon, à partir d'un environnement web, vous devrez peut-être faire quelque chose de méchant comme configurer une machine différente pour faire des requêtes vers une certaine page sur un intervalle de temps.
J'ai utilisé Abidar avec succès dans un ASP.NET projet (voici quelques Informations générales).
Le seul problème avec cette méthode est que les tâches ne seront pas exécutées si ASP.NET l'application web est déchargée de la mémoire (ie. en raison de la faible utilisation). Une chose que j'ai essayé est de créer une tâche pour frapper l'application web toutes les 5 minutes, en la gardant en vie, mais cela ne semblait pas fonctionner de manière fiable, alors maintenant j'utilise le planificateur Windows et l'application console de base pour le faire plutôt.
La solution idéale est de créer un service Windows, bien que cela puisse ne pas être possible (ie. si vous utilisez un environnement d'hébergement partagé). Cela rend également les choses un peu plus faciles du point de vue de la maintenance pour garder les choses dans l'application web.
Voici une autre façon:
1) Créez un script web "heartbeat" qui est responsable du lancement des tâches si elles sont dues ou en retard à lancer.
2) Créez un processus planifié quelque part (de préférence sur le même serveur web) qui frappe le webscript et le force à s'exécuter à intervalles réguliers. (par exemple, la tâche de planification windows qui lance discrètement le script heatbeat en utilisant IE ou whathaveyou)
Le fait que le code de tâche soit contenu dans un script web est purement pour garder le code dans La base de code de l'application web (l'hypothèse est que les deux dépendent l'un de l'autre), ce qui serait plus facile à gérer pour les développeurs web.
L'autre approche consiste à créer un script / programme de serveur exécutable qui fait tout le travail de planification lui-même et exécute l'exécutable lui-même en tant que tâche planifiée. Cela peut permettre un découplage fondamental entre l'application web et la tâche planifiée. Par conséquent si vous avez besoin de vos tâches planifiées de fonctionner même en même que l'application web / base de données peut être en panne ou inaccessible, vous devriez aller avec cette approche.
Vous pouvez facilement créer un service Windows qui exécute du code sur l'intervalle en utilisant le ' ThreadPool.RegisterWaitForSingleObject' méthode. Il est vraiment lisse et assez facile à mettre en place. Cette méthode est une approche plus rationnelle alors utiliser des Minuteries dans le Cadre.
Regardez le lien ci-dessous pour plus d'informations:
Exécution D'un processus périodique dans. NET à L'aide D'un Service:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
Nous utilisons également des applications de console. Si vous utilisez des outils de journalisation comme Log4net, vous pouvez surveiller correctement leur exécution. En outre, Je ne sais pas comment ils sont plus difficiles à maintenir qu'une page web, étant donné que vous pouvez partager certaines des mêmes bibliothèques de code entre les deux si elle est conçue correctement.
Si vous êtes contre l'exécution de ces tâches sur une base chronométrée, vous pouvez avoir une page web dans votre section administrative de votre site web qui agit comme une file d'attente. L'utilisateur insère une requête à exécuter la tâche, elle insère à son tour un enregistrement datestamp vide sur la table MyProcessQueue et votre tâche planifiée vérifie toutes les X minutes pour un nouvel enregistrement dans MyProcessQueue. De cette façon, il ne fonctionne que lorsque le client veut qu'il aille.
J'espère que ces suggestions vous aideront.
Une option serait de configurer un service windows et de l'obtenir pour appeler votre tâche planifiée.
Dans winforms j'ai utilisé des Timers mis ne pense pas que cela fonctionnerait bien dans ASP.NET
Une nouvelle bibliothèque de classes de Planificateur de tâches pour. NET
Remarque: depuis la création de cette bibliothèque, Microsoft a introduit un nouveau planificateur de tâches (Task Scheduler 2.0) Pour Windows Vista. Cette bibliothèque est un wrapper pour L'interface Task Scheduler 1.0, qui est toujours disponible dans Vista et est compatible avec Windows XP, Windows Server 2003 et Windows 2000.