2017-07-14 1 views
1

J'utilise Quartz.net dans un service Windows pour planifier des tâches qui existent dans ma base de données.Comment recharger périodiquement tous les travaux et les horaires dans Quartz.Net?

Mes utilisateurs auront un frontal à cette table, ce qui leur permettra de modifier l'expression CRON. Actuellement, mon application n'a aucune logique pour modifier l'expression CRON ou ajouter/supprimer des tâches sans redémarrer le service (car cela déclenchera le rechargement des tâches). J'utilise le code ci-dessous pour charger tous les travaux de ma base de données. Comment procéder pour effacer la file d'attente du planificateur et recharger les tâches? Par exemple, en vérifiant toutes les heures? Est-ce que Quartz.Net a une fonction intégrée pour le faire? Ou devrais-je créer une logique qui déchargerait tous les travaux/horaires et les rechargerait? Si je supprime un travail en cours, ce travail sera-t-il arrêté ou continuera-t-il?

Tout conseil sur la meilleure façon de mettre en œuvre ce serait génial.

+0

Quartz dispose de suffisamment de méthodes pour modifier et replanifier vos Jobs et Triggers. Utilisez ceci au lieu de redémarrer le planificateur. Il n'est également pas nécessaire de conserver les informations Job/Trigger dans un tableau séparé. Quartz peut interagir avec votre base de données pour enregistrer les états de tous les travaux. – Rabban

Répondre

1

Je pense que vous pouvez arrêter le planificateur et recommencer.

scheduler.Shutdown(); 
//Recreate the scheduler 
//Recreate jobs 
scheduler.Start(); 
+0

Je suppose que cela tuerait des travaux en cours? – Lock

+0

Vous pouvez également utiliser 'void Shutdown (bool waitForJobsToComplete)'. Description 'waitForJobsToComplete: si true, le planificateur ne permet pas à cette méthode de retourner tant que tous les travaux en cours d'exécution ne sont pas terminés.' – PinBack

+0

Je ne comprends pas le downvote ici. Bien que je pense qu'il y a un petit trou dans la logique (que ma réponse adresse), cette réponse n'est pas un candidat à l'IMHO downvote. – granadaCoder

0

D'abord, je ne sais pas pourquoi la réponse PinBack a été downvoted. Ce n'est pas une réponse folle. Deuxièmement, alors que je pense que PinBack était proche, je vais ajouter quelques commentaires et le code que je considérerais.

D'abord un lien vers l'API.

http://quartznet.sourceforge.net/apidoc/2.0/html/

Comme il n'y a pas de méthode « .Refresh » ..... vous pouvez envisager le code ci-dessous ..... Si le planificateur existe déjà, il sera gracieusement le fermer. puis il va forcer un "refresh" (aka, faire un nouvel appel à GetScheduler), et le démarrer, et retourner le planificateur nouvellement actualisé.

private IScheduler InitializeOrRefreshScheduler(IScheduler existingScheduler) 
    { 
     IScheduler returnSchedule = null; 

     if (null != existingScheduler) 
     { 
      existingScheduler.Shutdown(true); /* gracefully shut down the scheduler http://quartznet.sourceforge.net/apidoc/2.0/html/html/31359f2c-7a57-50e8-5e8b-102ceb3991c9.htm */ 
     } 
     else 
     { 
      /* the existingScheduler is null, so it would be null on "first startup" */ 
     } 

     var config = (NameValueCollection)ConfigurationManager.GetSection("quartz"); 

     ISchedulerFactory factory = new StdSchedulerFactory(config); 
     returnSchedule = factory.GetScheduler();  
     returnSchedule.Start();    

     return returnSchedule; 
    }