223 votes

Meilleure façon d'exécuter des tâches planifiées

Aujourd'hui, nous avons construit une application console pour exécuter les tâches planifiées pour notre site Web ASP.NET. 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 courriel à partir d'une file d'attente de courriel dans la base de données
  • Suppression des objets périmés de la base de données
  • Récupérer les statistiques de Google AdWords et remplir une table dans la base de données.

127voto

BC. Points 9229

Cette technique par Jeff Atwood pour Stackoverflow est la méthode la plus simple que j'ai rencontrée. Elle s'appuie sur le mécanisme de rappel "élément de cache supprimé" intégré au système de cache d'ASP.NET.

Mise à jour : Stackoverflow a dépassé cette méthode. Elle ne fonctionne que lorsque le site Web est en cours d'exécution, mais il s'agit d'une technique très simple et utile pour de nombreuses personnes.

Consultez également Quartz.NET

72voto

Brettski Points 5485

Toutes mes tâches (qui doivent être planifiées) pour un site web sont conservées dans le site web et appelées depuis une page spéciale. J'ai ensuite écrit un service Windows simple 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 encore du travail à faire, je relance la page tout de suite, sinon je la relance dans un petit moment. Cela a très bien fonctionné pour moi et permet de conserver toute la logique de mes tâches dans le code web. Avant d'écrire le service Windows simple, j'utilisais le planificateur Windows pour appeler la page toutes les x minutes.

Une autre façon pratique d'exécuter cette opération est d'utiliser un service de surveillance tel que Pingdom . Dirigez leur contrôle http vers la page qui exécute votre code de service. Faites en sorte que la page renvoie des résultats qui peuvent ensuite être utilisés pour déclencher l'envoi de messages d'alerte par Pingdom lorsque quelque chose ne va pas.

30voto

Chris Van Opstal Points 16961

Créer un Service Windows personnalisé .

J'avais des tâches critiques configurées comme des applications de console programmées et je les trouvais difficiles à maintenir. J'ai créé un service Windows avec un "battement de cœur" qui vérifie un programme dans ma base de données toutes les deux minutes. Cela a très bien fonctionné.

Cela dit, j'utilise toujours des applications de console programmées pour la plupart de mes tâches de maintenance non critiques. Si ce n'est pas cassé, ne le réparez pas.

17voto

Daniel Auger Points 8459

J'ai trouvé que c'était facile pour toutes les parties concernées :

  • Créez une méthode de service Web telle que DoSuchAndSuchProcess.
  • Créez une application console qui appelle cette webméthode.
  • 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 disposez de la fiabilité du gestionnaire de tâches de Windows, ou de tout autre gestionnaire de tâches commercial, pour la lancer et enregistrer toute information de retour telle qu'un rapport d'exécution. L'utilisation d'un service Web au lieu de l'affichage sur une page présente un certain avantage car il est plus facile d'obtenir des données de retour à partir d'un service Web.

10voto

Moises Goncalves Points 107

Pourquoi réinventer la roue, utiliser la classe Threading et 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
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X