You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

223 lines
8.8 KiB

using log4net;
using Quartz;
using Quartz.Impl;
using System;
using System.Threading.Tasks;
namespace WebApp.Jobs.ClearFiles
{
public class RunJob : RJob
{
private static ILog log = LogManager.GetLogger(typeof(RunJob));
public virtual async Task Run()
{
log.Debug("------- Initializing -------------------");
// First we must get a reference to a scheduler
ISchedulerFactory sf = new StdSchedulerFactory();
var sched = await sf.GetScheduler();
log.Debug("------- Initialization Complete --------");
log.Debug("------- Scheduling Jobs ----------------");
// jobs can be scheduled before sched.start() has been called
// get a "nice round" time a few seconds in the future...
var startTime = DateBuilder.NextGivenSecondDate(null, 15);
// job1 will only fire once at date/time "ts"
var job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job1", "group1")
.Build();
var trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(startTime)
.Build();
// schedule it to run!
DateTimeOffset? ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// job2 will only fire once at date/time "ts"
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job2", "group1")
.Build();
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger2", "group1")
.StartAt(startTime)
.Build();
ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// job3 will run 11 times (run once and repeat 10 more times) job3 will repeat every 10 seconds
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job3", "group1")
.Build();
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(10))
.Build();
ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// the same job (job3) will be scheduled by a another trigger this time will only repeat
// twice at a 70 second interval
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger3", "group2")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(2))
.ForJob(job)
.Build();
ft = await sched.ScheduleJob(trigger);
log.Debug(job.Key +
" will [also] run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// job4 will run 6 times (run once and repeat 5 more times) job4 will repeat every 10 seconds
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job4", "group1")
.Build();
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger4", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(5))
.Build();
ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// job5 will run once, five minutes in the future
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job5", "group1")
.Build();
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute))
.Build();
ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// job6 will run indefinitely, every 40 seconds
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job6", "group1")
.Build();
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger6", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(40).RepeatForever())
.Build();
ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
log.Debug("------- Starting Scheduler ----------------");
// All of the jobs have been added to the scheduler, but none of the jobs will run until
// the scheduler has been started
await sched.Start();
log.Debug("------- Started Scheduler -----------------");
// jobs can also be scheduled after start() has been called... job7 will repeat 20 times,
// repeat every five minutes
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job7", "group1")
.Build();
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInMinutes(5).WithRepeatCount(20))
.Build();
ft = await sched.ScheduleJob(job, trigger);
log.Debug(job.Key +
" will run at: " + ft +
" and repeat: " + trigger.RepeatCount +
" times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");
// jobs can be fired directly... (rather than waiting for a trigger)
job = JobBuilder.Create<ClearFilesJob>()
.WithIdentity("job8", "group1")
.StoreDurably()
.Build();
await sched.AddJob(job, true);
log.Debug("'Manually' triggering job8...");
await sched.TriggerJob(new JobKey("job8", "group1"));
log.Debug("------- Waiting 30 seconds... --------------");
try
{
// wait 30 seconds to show jobs
await Task.Delay(TimeSpan.FromSeconds(30));
// executing...
}
catch (Exception)
{
throw;
}
// jobs can be re-scheduled... job 7 will run immediately and repeat 10 times for every second
log.Debug("------- Rescheduling... --------------------");
trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.StartAt(startTime)
.WithSimpleSchedule(x => x.WithIntervalInMinutes(5).WithRepeatCount(20))
.Build();
ft = await sched.RescheduleJob(trigger.Key, trigger);
log.Debug("job7 rescheduled to run at: " + ft);
log.Debug("------- Waiting five minutes... ------------");
// wait five minutes to show jobs
await Task.Delay(TimeSpan.FromMinutes(5));
// executing...
log.Debug("------- Shutting Down ---------------------");
await sched.Shutdown(true);
log.Debug("------- Shutdown Complete -----------------");
// display some stats about the schedule that just ran
var metaData = await sched.GetMetaData();
log.Debug($"Executed {metaData.NumberOfJobsExecuted} jobs.");
}
}
}