我在应用程序中使用 Quartz Scheduler,但出现异常:触发器未引用给定作业...
查看我的代码,我似乎看不出问题出在哪里。
var schedFact = new StdSchedulerFactory();
scheduler = schedFact.GetScheduler();
IJobDetail dailyJob = JobBuilder.Create<PushElectricityPricesJob>()
.WithIdentity("dailyJob", "group1")
.Build();
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("dailyJobTrigger", "group1")
.StartNow()
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(3, 0))
.ForJob("dailyJob")
.Build();
scheduler.ScheduleJob(dailyJob, trigger1);
IJobDetail monthlyJob = JobBuilder.Create<PushContributionsJob>()
.WithIdentity("monthlyJob", "group2")
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("monthlyJobTrigger", "group2")
.StartNow()
.WithSchedule(CronScheduleBuilder.MonthlyOnDayAndHourAndMinute(1, 0, 0))
.ForJob("monthlyJob")
.Build();
scheduler.ScheduleJob(monthlyJob, trigger2);
scheduler.Start();
我确实在 StackOverflow 上发现了很多类似这样的帖子,但在每一个帖子上我都可以发现开发人员犯的错误或拼写错误。在这里我只是一无所知..
有什么想法吗?
好的找到了!
问题是由于群体造成的。可以在不指定组的情况下调用 WithIdentity 方法,只需使用名称即可。
所以就变成了:
IJobDetail dailyJob = JobBuilder.Create<PushElectricityPricesJob>()
.WithIdentity("dailyJob")
.Build();
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("dailyJobTrigger")
.StartNow()
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(3, 0))
.ForJob("dailyJob")
.Build();
这似乎运作良好。 当然,您需要对其他工作做同样的事情。
删除 .ForJob("dailyJob")
或更改为其他
在trigger.forJob(“job01”,“group1”)上使用jobDetail.withIdentity(“job01”,“group1”)上使用的相同组
需要告知触发器您的作业正在使用哪个组,例如:
var schedFact = new StdSchedulerFactory();
scheduler = schedFact.GetScheduler();
IJobDetail dailyJob = JobBuilder.Create<PushElectricityPricesJob>()
.WithIdentity("dailyJob", "group1")
.Build();
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("dailyJobTrigger", "group1")
.StartNow()
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(3, 0))
.ForJob("dailyJob", "group1")
.Build();
scheduler.ScheduleJob(dailyJob, trigger1);
除此之外,它会认为它使用的是 DEFAULT 组并且不起作用。
该错误基本上意味着:
JobKey
中定义的JobDetail
与JobKey
中定义的Trigger
不匹配。所以,让:
JobBuilder.withIdentity(JobKey.jobKey("ABC"))
TriggerBuilder.withIdentity(JobKey.jobKey("ABC"))
显然你也必须使两个组的名称相同;或删除两者
您应该在 With Identity() 作业和触发器中添加组名称。
工作
JobBuilder
.Create<BackupJob>()
.WithIdentity(todo.Name,"group1")
.WithDescription(todo.Name)
.Build();
触发
JobBuilder
.Create<BackupJob>()
.WithIdentity(todo.Name,"group1")
.WithDescription(todo.Name)
.Build();