Quartz C# scheduler to run every 5 minutes at 2 seconds, every N minutes at X seconds

Viewed 41

I want to schedule a job every N minutes at X seconds, that is every 5(can be 1,3,5,10,15...n) minutes this is straight WithIntervalInMinutes(1). But I need addition to this trigger should be executed ad 2nd second of that trigger minute. For example Trigger starts now or at specified time lets say at 9:15 AM, with interval 5 minutes 2 seconds, then it should trigger 9:20:02, 9:25:02, 9:30:02 (02 is seconds of that minute)

so far i tried, fully working example

public class MyJobScheduler : IMyJobScheduler
{
private readonly IScheduler _scheduler;

public MyJobScheduler(IScheduler scheduler)
{
    _scheduler = scheduler;
}

public void Start()
{

    _scheduler.Start();


    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity("ScrapGoldRateTrigger1", "group123").StartNow()
        .WithSimpleSchedule(x => x
                .RepeatForever()
                .WithIntervalInSeconds(2)
        )
        .Build();


    ITrigger trigger2_every5min_at_2_seconds = TriggerBuilder.Create()
        .WithIdentity("ScrapGoldRateTrigger2", "group123").StartNow()
        .WithSimpleSchedule(x => x
                .RepeatForever()
                .WithIntervalInMinutes(5) // it can be any minute frequency
                .WithIntervalInSeconds(2)
                )
        .Build();

    IJobDetail job1 = JobBuilder.Create<ScrapperCandlesHistoryJob>()
        .WithIdentity("ScrapGoldRate", "group123")
        .Build();

    var listOfJobs =
        new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>() { { job1, new ITrigger[2] { trigger, trigger2_every5min_at_2_seconds } } };


    _scheduler.ScheduleJobs(listOfJobs, replace: true, default);
}

trigger2_every5min_at_2_seconds this trigger is not working as expected. this should execute every 5 minutes at 2 seconds. or if configured every 3 minutes at 6 seconds means if trigger start time at 9:15, then 9:18:06, 9:21:06 and so on it should execute. Python i'm able to with this trigger Trigger([ CronTrigger(day_of_week='*', hour='9', minute='35', second='2', timezone="Asia/Kolkata")]

cron expression seems not support seconds level "*/5 * * * *"

Job class

public class ScrapperCandlesHistoryJob : IJob
 {
private ILogger logger;

public ScrapperCandlesHistoryJob()
{
    this.logger = LogManager.GetLogger("default");
}

async Task IJob.Execute(IJobExecutionContext context)
{
    logger.Info($"@ {DateTime.Now} job {context.JobDetail.Key.Name} is executing...");
    logger.Info("Trigger {0} in group {1} was fired", context.Trigger.Key.Name, context.Trigger.Key.Group);
}
 }

any help would be greatly appreciated.

1 Answers

To answer "For example Trigger starts now or at specified time lets say at 9:15 AM, with interval 5 minutes 2 seconds, then it should trigger 9:20:02, 9:25:02, 9:30:02 (02 is seconds of that minute)"

Create start time at 9:15 and set seconds at 02, see startTime, end time is optional based on requirement.

.WithIntervalInMinutes(5) is as usual 5,10,15, N mintues

Finally we can test triggers with var dt = trigger.GetNextFireTimeUtc();


    var dateNow = DateTime.Now;
    var startTime = new DateTime(year: dateNow.Year, month: dateNow.Month, day: dateNow.Day, hour: 9, minute: 15, second: 2);

    var endTime = new DateTime(year: dateNow.Year, month: dateNow.Month, day: dateNow.Day, hour: 15, minute: 19, second: 5);

    Console.WriteLine($"Start time {startTime}");
    Console.WriteLine($"End time {endTime}");

    ITrigger trigger2_every5min_at_2_seconds = TriggerBuilder.Create()
        .WithIdentity("ScrapGoldRateTrigger2", "group123")
        .StartAt(startTime)
        .EndAt(endTime)
        .WithSimpleSchedule(x => x
                .RepeatForever()
                .WithIntervalInMinutes(5)
                )
        .Build();

    var dt = trigger.GetNextFireTimeUtc();
    var times = TriggerUtils.ComputeFireTimes(trigger2_every5min_at_2_seconds as IOperableTrigger,
        null, 100);

    foreach (var time in times)
    {
        Console.WriteLine(time.ToLocalTime());
    }

Output Start time 25-09-2022 09:15:02

End time 25-09-2022 15:19:05

25-09-2022 09:15:02 +05:30

25-09-2022 09:20:02 +05:30

25-09-2022 09:25:02 +05:30

25-09-2022 09:30:02 +05:30

25-09-2022 09:35:02 +05:30

25-09-2022 09:40:02 +05:30

25-09-2022 09:45:02 +05:30

25-09-2022 09:50:02 +05:30

25-09-2022 09:55:02 +05:30

25-09-2022 10:00:02 +05:30

25-09-2022 10:05:02 +05:30

25-09-2022 10:10:02 +05:30

25-09-2022 10:15:02 +05:30

25-09-2022 10:20:02 +05:30

25-09-2022 10:25:02 +05:30

25-09-2022 10:30:02 +05:30

Related