Вы можете определить три разных задания (или вы можете запускать одно и то же задание более одного раза) в день, еженедельно и ежемесячно и назначить триггерам соответствующие значения cron.
Использовать http://www.cronmaker.com/для планирования.
Вы можете использовать структуру, подобную следующей.
В методе Global asax Application_Start достаточно вызвать метод QuartzServer.Start ().
Этот код был написан в соответствии с последней версией quatz. Это важно, потому что в предыдущих версиях 3.0 отсутствует асинхронная поддержка.
Задание электронной почты:
С атрибутом [DisallowConcurrentExecution] ожидается завершение текущей работы, если наступит время для повторного запуска, когдазадание выполняется
[DisallowConcurrentExecution]
public class MailJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
// Do Work
await Console.Out.WriteLineAsync("Mail Job is executing.");
}
}
Кварцевый сервер Класс
public class QuartzServer
{
private static IScheduler _scheduler;
[MethodImpl(MethodImplOptions.Synchronized)]
public static void Start()
{
_scheduler = StdSchedulerFactory.GetDefaultScheduler().GetAwaiter().GetResult();
Load();
_scheduler.Start();
}
[MethodImpl(MethodImplOptions.Synchronized)]
public static void Stop()
{
_scheduler.Shutdown(true);
}
[MethodImpl(MethodImplOptions.Synchronized)]
private static void Load()
{
JobCreator.CreateJob<MailJob>(new JobInfo
{
JobName = "MailJob",
TriggerName = "MainJobTrg",
GroupName = "MainJobGroup",
DataParamters = null,
CronExpression = "paste here cronmaker time planning string"
}, ref _scheduler);
// Define job Daily , weekly and mounthly
}
}
JobCreator Class
public sealed class JobCreator
{
public static void CreateJob<T>(JobInfo jInfo, ref IScheduler scheduler) where T : IJob
{
JobBuilder jbuilder = JobBuilder.Create<T>();
jbuilder.WithIdentity(jInfo.JobName, jInfo.GroupName);
if (jInfo.DataParamters != null && jInfo.DataParamters.Any())
{
foreach (var item in jInfo.DataParamters)
{
jbuilder.UsingJobData(GetDataMap(item));
}
}
IJobDetail jobDetail = jbuilder.Build();
TriggerBuilder tBuilder = TriggerBuilder.Create();
tBuilder.WithIdentity(jInfo.TriggerName, jInfo.GroupName)
.StartNow()
.WithCronSchedule(jInfo.CronExpression);
//.WithSimpleSchedule(x => x
// .WithIntervalInSeconds(10)
// .RepeatForever());
ITrigger trigger = tBuilder.Build();
scheduler.ScheduleJob(jobDetail, trigger);
}
private static JobDataMap GetDataMap(DataParameter dataParameter)
{
JobDataMap jDataMap = new JobDataMap();
switch (dataParameter.Value.GetType().Name)
{
case "Int32":
jDataMap.Add(dataParameter.Key, (int)dataParameter.Value);
break;
case "String":
jDataMap.Add(dataParameter.Key, dataParameter.Value);
break;
}
return jDataMap;
}
}