Quartz.NET e' una libreria utile per pianificare l'esecuzione di operazioni ad istanti temporali predefiniti. Per creare un'operazione pianificabile e' necessario:
- Creare uno Scheduler, ovvero l'oggetto responsabile dell'esecuzione delle operazioni al verificarsi delle condizioni stabilite.
- Creare un Job, ovvero l'operazione da eseguire al verificarsi delle condizioni. Dal punto di vista informatico occorre creare una classe che implementa l'interfaccia Quartz.IJob.
- Creare un Trigger, ovvero l'oggetto che determina il momento in cui una determinata operazione deve essere eseguita.
Creo il Job:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz;
using Quartz.Impl;
namespace TestQuartz
{
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("MyJob Execute: {0}", context.JobDetail.Key);
}
}
}
Quindi configuro l'applicazione per eseguire il job ad instanti precisi:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz;
using Quartz.Impl;
namespace TestQuartz
{
class Program
{
static void Main(string[] args)
{
// crea uno schedulerFactory
ISchedulerFactory schedFact = new StdSchedulerFactory();
// ottiene lo scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();
IJobDetail job1 = JobBuilder.Create<MyJob>()
.WithIdentity("myJob1", "group1")
.Build();
IJobDetail job2 = JobBuilder.Create<MyJob>()
.WithIdentity("myJob2", "group1")
.Build();
// crea un trigger che esegue ogni 5 secondi
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("myTrigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
// crea un trigger che esegue ogni giorno alle 15 e 45
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("myTrigger2", "group1")
.StartNow()
.WithDailyTimeIntervalSchedule(x => x
.WithIntervalInHours(24)
.OnEveryDay().StartingDailyAt(new TimeOfDay(15, 45)))
.Build();
sched.ScheduleJob(job1, trigger1);
sched.ScheduleJob(job2, trigger2);
Console.WriteLine("Press ENTER to exit");
Console.ReadLine();
sched.Shutdown(true);
}
}
}
In questo esempio il job viene eseguito mediante due trigger distinti (si potevano anche creare job differenti associati a trigger differenti), uno che scatta ogni 5 secondi ed uno che scatta alla 15 e 45 di ogni giorno.
TestQuartz.zip