André Haupt
André Haupt

Reputation: 3524

Get all jobs in Quartz.NET 2.0

I've setup my AdoJobStore on the server and all my jobs are running perfectly. Now I am writing a remote client to manage all my jobs.

Scheduling new jobs is straightforward enough, but I can't seem to retrieve a list of existing jobs in version 2.0. All the resources I found did something like the following.

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]);
    }
}

The problem I'm facing is that GetJobNames has been removed, and looking at the source code, has been moved to the base class JobStoreSupport, which JobStoreCMS inherits from. The method has however been marked as protected, so it is inaccessible from the outside.

How would one go about retrieving a job list in 2.0?

Upvotes: 24

Views: 33758

Answers (5)

Muhammad Zeeshan
Muhammad Zeeshan

Reputation: 41

For .Net Core latest versions you can use

private async Task getScheduledJobListAsync(IScheduler scheduler)
{
    var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup());
    
    foreach (var jobKey in jobKeys)
    {
        var jobDetail = await scheduler.GetJobDetail(jobKey);

        if (jobDetail != null)
        {
            var triggers = await scheduler.GetTriggersOfJob(jobKey);
            foreach (var trigger in triggers)
            {
                Console.WriteLine("Job Key = " + jobKey.Name);
                Console.WriteLine("Job Schduled Time = " + trigger.GetNextFireTimeUtc()?.ToString() ?? "Not scheduled");
                Console.WriteLine("Job Group = " + jobKey.Group);
                Console.WriteLine("Job Trigger Name= " + trigger.Key.Name);
            }
        }
    }
}

Upvotes: 2

Hasan_Naser
Hasan_Naser

Reputation: 224

For Quartz.NET version 3.0 you can use

this will show you all running jobs and triggers in 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);

            }
}

I've used the code found here.

Upvotes: 2

LeftyX
LeftyX

Reputation: 35587

You can use fetch a list of executing jobs:

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

or fetch all the info about scheduled jobs (sample console application):

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());
                }
            }
        }
    } 
}

I've used the code found here.

UPDATE:

If someone is interested a sample code can be downloaded from my GitHub repository.

Someone asked how to get a list of job completed.
I don't think there's an easy way for that.
The only option which comes to mind is using a job (or trigger) listener.

I've uploaded a sample on github where my main program can receive events of completed jobs.

Upvotes: 49

KeyNone
KeyNone

Reputation: 9150

Since Quartz.NET version 2.2.1 you can make use of GroupMatcher<>.AnyGroup(), here implemented as an extension method to 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;
}

This will get you a list of IJobDetails for every scheduled job.

Upvotes: 10

superlogical
superlogical

Reputation: 14950

If you want to get the Repeat Interval, Repeat Count etc cast the ITrigger to 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); 
}

Upvotes: 6

Related Questions