2012-09-19 52 views
10

我已经在服务器上设置了我的AdoJobStore,并且所有工作都完美运行。现在我正在编写一个远程客户端来管理我的所有工作。获取Quartz.NET 2.0中的所有工作

调度新作业很简单,但我似乎无法检索2.0版中的现有作业列表。我找到的所有资源都做了如下的事情。

var groups = sched.JobGroupNames; 
for (int i = 0; i < groups.Length; i++) 
{ 
    string[] names = sched.GetJobNames(groups[i]); 
    for (int j = 0; j < names.Length; j++) 
    { 
     var currentJob = sched.GetJobDetail(names[j], groups[i]); 
    } 
} 

我现在面临的问题是,GetJobNames已被移除,并且在看的源代码,已被移动到的基类JobStoreSupport,其JobStoreCMS从继承。然而该方法被标记为受保护的,因此从外部无法访问该方法。

如何在2.0中检索工作列表?

+0

嘿你有编辑日程安排的例子吗?我新来这个,并有一个噩梦!请帮忙 –

回答

38

您可以使用取执行作业的列表:

var executingJobs = sched.GetCurrentlyExecutingJobs(); 
foreach (var job in executingJobs) 
{ 
    // Console.WriteLine(job.JobDetail.Key); 
} 

或获取所有有关计划作业的信息(样本控制台应用程序):

private static void GetAllJobs(IScheduler scheduler) 
{ 
    IList<string> jobGroups = scheduler.GetJobGroupNames(); 
    // IList<string> triggerGroups = scheduler.GetTriggerGroupNames(); 

    foreach (string group in jobGroups) 
    { 
     var groupMatcher = GroupMatcher<JobKey>.GroupContains(group); 
     var jobKeys = scheduler.GetJobKeys(groupMatcher); 
     foreach (var jobKey in jobKeys) 
     { 
      var detail = scheduler.GetJobDetail(jobKey); 
      var triggers = scheduler.GetTriggersOfJob(jobKey); 
      foreach (ITrigger trigger in triggers) 
      { 
       Console.WriteLine(group); 
       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(nextFireTime.Value.LocalDateTime.ToString()); 
       } 

       DateTimeOffset? previousFireTime = trigger.GetPreviousFireTimeUtc(); 
       if (previousFireTime.HasValue) 
       { 
        Console.WriteLine(previousFireTime.Value.LocalDateTime.ToString()); 
       } 
      } 
     } 
    } 
} 

我用找到的代码here

UPDATE

如果有人有兴趣的样本代码可以从我的GitHub repository下载。

有人问如何获得完成的工作清单。
我不认为有一个简单的方法。
想到的唯一选择是使用作业(或触发器)侦听器。

我在github上传了一个sample,我的主程序可以接收已完成工作的事件。

+0

谢谢!奇迹般有效。 –

+1

第二块代码正是我所期待的。谢谢! –

+0

在那个例子中,什么是“sched”,它来自哪里? – wexman

4

如果你想要得到的重复间隔,重复计数等投的ITrigger到ISimpleTrigger

private void LogInfo(IScheduler scheduler) 
{ 
    log.Info(string.Format("\n\n{0}\n", Scheduler.GetMetaData().GetSummary())); 

    var jobGroups = scheduler.GetJobGroupNames(); 
    var builder = new StringBuilder().AppendLine().AppendLine(); 

    foreach (var group in jobGroups) 
    { 
     var groupMatcher = GroupMatcher<JobKey>.GroupContains(group); 
     var jobKeys = scheduler.GetJobKeys(groupMatcher); 

     foreach (var jobKey in jobKeys) 
     { 
      var detail = scheduler.GetJobDetail(jobKey); 
      var triggers = scheduler.GetTriggersOfJob(jobKey); 

      foreach (ITrigger trigger in triggers) 
      { 
       builder.AppendLine(string.Format("Job: {0}", jobKey.Name)); 
       builder.AppendLine(string.Format("Description: {0}", detail.Description)); 
       var nextFireTime = trigger.GetNextFireTimeUtc(); 
       if (nextFireTime.HasValue) 
       { 
        builder.AppendLine(string.Format("Next fires: {0}", nextFireTime.Value.LocalDateTime)); 
       } 
       var previousFireTime = trigger.GetPreviousFireTimeUtc(); 
       if (previousFireTime.HasValue) 
       { 
        builder.AppendLine(string.Format("Previously fired: {0}", previousFireTime.Value.LocalDateTime)); 
       } 
       var simpleTrigger = trigger as ISimpleTrigger; 
       if (simpleTrigger != null) 
       { 
        builder.AppendLine(string.Format("Repeat Interval: {0}", simpleTrigger.RepeatInterval)); 
       } 
       builder.AppendLine(); 
      } 
     } 
    } 

    builder.AppendLine().AppendLine(); 
    log.Info(builder.ToString); 
} 
2

由于Quartz.NET 2.2.1版本,你可以使GroupMatcher<>.AnyGroup()使用,在这里实现为扩展方法IScheduler

public static List<IJobDetail> GetJobs(this IScheduler scheduler) 
{ 
    List<IJobDetail> jobs = new List<IJobDetail>(); 

    foreach (JobKey jobKey in scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup())) 
    { 
     jobs.Add(scheduler.GetJobDetail(jobKey)); 
    } 

    return jobs; 
} 

这将让你的IJobDetail个列表,每调度作业。

相关问题