[英]ASP.NET MVC Job scheduler
我在我的项目中使用QUARTZ.Net作为我的工作计划程序,我的目标是我希望用户被安排电子邮件并触发它们(每月/每周/每天)。 可以说我的主机是蔚蓝的..,我想创建一个应用程序并进行部署。 我应该在哪里安排我的计划,如果我将其放在下面
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//here
}
}
我希望它始终运行,无论是否有请求。
您可以每天,每周和每月定义三个不同的作业(或者可以多次触发同一作业),并将适当的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类
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;
}
}
我们使用的是Quartz.NET,但不发送电子邮件,我们使用的是获取数据其他服务。此Quartz Service和Quartz Client有2个应用程序。
Quartz服务是一个控制台应用程序及其创建作业。
Quartz Client是一个MVC应用程序,我们监视,作业手动触发它们。
这是官方教程Quartz Tutorial
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.