2012-11-29 2 views
4

J'ai essayé la documentation de Quartz.com & googled pour le couple pendant des heures ... mais n'a pas pu trouver le bon article simple sur la façon d'obtenir le prochain travail (qui est supposé tirer à l'avenir). J'utilise CronTrigger Expression pour planifier des travaux en utilisant VB.net (winforms). les travaux fonctionnent bien ... cependant je voudrais que mes utilisateurs voient quand FIRE le prochain. Je stocke CronExpression dans ma base de données, Puis-je utiliser cette Expression pour afficher prochain Fire Date/Time à mes utilisateurs finaux? ou s'il y a un autre moyen possible, veuillez le conseiller (avec un simple exemple).getNextFireTime de mon travail existant

Merci

Modifier

code suivant retour prochain travail se déclenche au bout de 12 minutes au lieu de 20 minutes

Dim exp As CronExpression = New CronExpression("0 0/20 * * * ?") 
    Dim nextFire As String = exp.GetNextValidTimeAfter(DateTime.Now) 
    MsgBox(nextFire) 
+0

Votre cronExpression devrait tirer à 00:00 puis 00:20, 00:40 etc. Donc, si vous commencez à 00:01, il fonctionnera 19 minutes plus tard et si vous commencez 00:19, il fonctionnera 1 minute plus tard. (Voir aussi http://www.cronmaker.com/) – sgmoore

Répondre

5

Vous pouvez créer une nouvelle JobKey

JobKey jobKey = new JobKey(jobName, groupName); 

et utilisez la clé pour aller chercher le détail de l'emploi:

var detail = scheduler.GetJobDetail(jobKey); 

ceci est une fonction simple qui fait ce que vous cherchez:

private DateTime getNextFireTimeForJob(IScheduler scheduler, string jobName, string groupName = "") 
    { 
     JobKey jobKey = new JobKey(jobName, groupName); 
     DateTime nextFireTime = DateTime.MinValue; 

     bool isJobExisting = Scheduler.CheckExists(jobKey); 
     if (isJobExisting) 
     { 
      var detail = scheduler.GetJobDetail(jobKey); 
      var triggers = scheduler.GetTriggersOfJob(jobKey); 

      if (triggers.Count > 0) 
      { 
       var nextFireTimeUtc = triggers[0].GetNextFireTimeUtc(); 
       nextFireTime = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTimeUtc.Value.DateTime); 
      } 
     } 

     return (nextFireTime); 
    } 

Cela fonctionne uniquement si vous avez un déclencheur par tâche.
S'il y a plus d'un déclencheur dans votre travail, vous pouvez faire une boucle à travers eux:

foreach (ITrigger trigger in triggers) 
{ 
    Console.WriteLine(jobKey.Name); 
    Console.WriteLine(detail.Description); 
    Console.WriteLine(trigger.Key.Name); 
    Console.WriteLine(trigger.Key.Group); 
    Console.WriteLine(trigger.GetType().Name); 
    Console.WriteLine(scheduler.GetTriggerState(trigger.Key)); 
    DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc(); 
    if (nextFireTime.HasValue) 
    { 
     Console.WriteLine(TimeZone.CurrentTimeZone.ToLocalTime(nextFireTime.Value.DateTime).ToString()); 
    } 
} 

ou LINQ (System.Linq):

var myTrigger = triggers.Where(f => f.Key.Name == "[trigger name]").SingleOrDefault(); 
+0

dans mon API je vois "JobKey" en tant que membre de classe TriggerWrapper , D'où je ne peux pas faire une nouvelle instance de JobKey. J'utilise la dernière version de quartz.net. – highwingers

+0

Existe-t-il un moyen de trouver toutes les occurrences dans une plage de date/heure? –

4

Si vous connaissez déjà le cronExpression alors vous pouvez appeler GetNextValidTimeAfter, par exemple

CronExpression exp = new CronExpression("0 0 0/1 1/1 * ? *"); 
var nextFire = exp.GetNextValidTimeAfter(DateTime.Now); 
Console.WriteLine(nextFire); 

et si vous voulez plus de temps de feu, puis

for(int i=0 ; i< 9; i++) 
{ 
    if (nextFire.HasValue) 
    { 
     nextFire = exp.GetNextValidTimeAfter(nextFire.Value);   
     Console.WriteLine(nextFire); 
    } 
} 

Si vous êtes à la recherche d'une façon plus générale de montrer à venir des temps de feu pour les emplois existants, puis vérifier la réponse à la question this qui fonctionne même si vous ne l'utilisez des expressions Cron. Ceci est pour la version Quartz 2

La méthode Quartz Version 1 pour obtenir des informations sur le travail et le déclenchement est similaire à la méthode ci-dessous.

public void GetListOfJobs(IScheduler scheduler) 
{ 
    var query = 
     (from groupName in scheduler.JobGroupNames 
     from jobName in scheduler.GetJobNames(groupName) 
     let triggers = scheduler.GetTriggersOfJob(jobName, groupName) 
     select new 
      { 
       groupName, 
       jobName, 
       triggerInfo = (from trigger in triggers select trigger) 
      } 
     ); 

    foreach (var r in query) 
    { 
     if (r.triggerInfo.Count() == 0) 
     { 
      var details = String.Format("No triggers found for : Group {0} Job {1}", r.groupName, r.jobName); 
      Console.WriteLine(details);     
     } 

     foreach (var t in r.triggerInfo) 
     { 
      var details = String.Format("{0,-50} {9} Next Due {1,30:r} Last Run {2,30:r} Group {3,-30}, Trigger {4,-50} {5,-50} Scheduled from {6:r} Until {7,30:r} {8,30:r} ", 
       t.JobName, 
       t.GetNextFireTimeUtc().ToLocalTime(), 
       t.GetPreviousFireTimeUtc().ToLocalTime(), 
       t.JobGroup, 
       t.Name, 
       t.Description, 
       t.StartTimeUtc.ToLocalTime(), 
       t.EndTimeUtc.ToLocalTime(), 
       t.FinalFireTimeUtc.ToLocalTime(), 
       ((t.GetNextFireTimeUtc() > DateTime.UtcNow) ? "Active " : "InActive") 
       ); 

      Console.WriteLine(details); 

     } 
    } 

}

+0

s'il vous plaît voir mon Edit. – highwingers

+0

Je n'utilise pas Quartz.net 2.0, j'ai essayé d'utiliser 2.0 avec mon projet et tout mon code n'a pas pu être compilé :( – highwingers

+0

Il y avait quelques changements d'API allant de V1 à V2, mais ils sont fastidieux mais assez simples. Je pense que la méthode CronExpression.GetNextValidTimeAfter est la même, mais j'ai inclus un exemple montrant comment récupérer des travaux et des déclencheurs existants sous la version 1. – sgmoore

Questions connexes