我在我的项目中使用QUARTZ.Net作为我的作业调度程序,我的目标是希望用户安排电子邮件并触发它们(每月/每周/每天)。 让我说我的主机是天蓝色的......我想创建一个应用程序并进行部署。 我应该在哪里安排我的预定,如果我把它放在
下会发生什么public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//here
}
}
我希望无论是否有请求,它都会一直运行。
答案 0 :(得分:1)
您可以每天,每周和每月定义三个不同的作业(或者您可以多次触发相同的作业),并为触发器分配适当的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.");
}
}
Quartz Server Class
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;
}
}
答案 1 :(得分:0)
Quartz服务是一个控制台应用程序及其创建作业。
Quartz Client 是一个MVC应用程序,我们手动监视作业 触发它们。
这是官方教程Quartz Tutorial