【问题标题】:Get all jobs in Quartz.NET 2.0获取 Quartz.NET 2.0 中的所有工作
【发布时间】:2012-09-11 10:50:03
【问题描述】:

我已经在服务器上设置了我的 AdoJobStore,我的所有作业都运行良好。现在我正在编写一个远程客户端来管理我的所有工作。

安排新工作很简单,但我似乎无法在 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 已被删除,并且查看源代码已移至 JobStoreCMS 继承自的基类 JobStoreSupport。但是,该方法已被标记为受保护,因此无法从外部访问。

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

【问题讨论】:

  • 嘿,你有关于编辑时间表的例子吗?我是新手,做噩梦!请帮忙

标签: c# scheduled-tasks quartz.net


【解决方案1】:

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

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找到的代码。

更新

如果有人感兴趣,可以从我的 GitHub repository 下载示例代码。

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

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

【讨论】:

  • 第二个代码块正是我要找的。谢谢!
  • 在那个例子中,什么是“sched”,它来自哪里?
  • 如果作业和触发器是从 .config 文件加载的,则它不起作用。有什么解决办法吗?
  • @Rwiti:它确实有效。你可以自己试试repo。干杯。
  • @Matt:JobDataMap 的信息可以在IJobDetail 中找到。在上面的函数中,您有时可以找到var detail = scheduler.GetJobDetail(jobKey);detail 现在引用了 IJobDetail 类型的对象,所以你应该能够做到 JobDataMap dataMap = detail.JobDataMap;
【解决方案2】:

如果您想获得重复间隔、重复计数等,请将 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); 
}

【讨论】:

    【解决方案3】:

    从 Quartz.NET 2.2.1 版开始,您可以使用GroupMatcher&lt;&gt;.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;
    }
    

    这将为您提供每个计划作业的IJobDetails 列表。

    【讨论】:

      【解决方案4】:

      对于 Quartz.NET 3.0 版,您可以使用

      这将向您显示quartz.net 3.x 中所有正在运行的作业和触发器

      using Quartz;
      using Quartz.Impl;
      using Quartz.Impl.Matchers;
      
          class Program
          {
                  var allTriggerKeys = scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.AnyGroup());
                  foreach (var triggerKey in allTriggerKeys.Result)
                  {
                   var triggerdetails =   scheduler.GetTrigger(triggerKey);
                   var Jobdetails = scheduler.GetJobDetail(triggerdetails.Result.JobKey);
      
                      Console.WriteLine("IsCompleted -" + triggerdetails.IsCompleted + " |  TriggerKey  - " + triggerdetails.Result.Key.Name + " Job key -" + triggerdetails.Result.JobKey.Name);
      
                  }
      }
      

      我已使用找到的代码 here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 2018-05-06
        • 1970-01-01
        相关资源
        最近更新 更多