您可以每天、每周和每月定义三个不同的作业(或者您可以多次触发同一个作业),并为触发器分配适当的 cron 值。
使用http://www.cronmaker.com/ 进行规划。
您可以使用如下结构。
在全局 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.");
}
}
Quartz 服务器类
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 类
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;
}
}