我有一个 Quartz 作业,它安排了一组触发器,它有 3 到 5 分钟的执行时间。但是在未来的任何时候(可能是一周后或几分钟后),我可能需要使用新的触发器集重新安排它。触发器集上会有一些添加或删除。
如何使用新的触发器集重新安排作业?这里的诀窍是,我想确保此时没有工作实例处于活动状态,因此我可以可靠地重新安排我的工作。谢谢你的帮助...
我有一个 Quartz 作业,它安排了一组触发器,它有 3 到 5 分钟的执行时间。但是在未来的任何时候(可能是一周后或几分钟后),我可能需要使用新的触发器集重新安排它。触发器集上会有一些添加或删除。
如何使用新的触发器集重新安排作业?这里的诀窍是,我想确保此时没有工作实例处于活动状态,因此我可以可靠地重新安排我的工作。谢谢你的帮助...
我记得,你可以这样做:
List<JobExecutionContext> context = scheduler.GetCurrentlyExecutingJobs()
迭代列表并调用 GetJobInstance()(或类似的方法)来查找为其创建上下文的作业,然后检查它是否是您感兴趣的作业。如果不是,您可以使用相同的触发器重新安排。尝试这样的事情:
Trigger trigger = Global.scheduler.GetTrigger("testTrigger","triggerGroup");
trigger.set();
Global.scheduler.RescheduleJob(trigger.JobName, trigger.JobGroup, trigger);
我重新安排了 ActiveDirectoryJob 如下:
public class ActiveDirectoryJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var staffService = new StaffService();
staffService.Synchronize();
int intervalTime=2;
ITrigger rsiTrigger = TriggerBuilder.Create()
.WithIdentity(context.Trigger.Key.Name)
.StartAt(DateTime.Now.AddHours(intervalTime))
.WithSimpleSchedule(x => x
.WithIntervalInHours(intervalTime)
.RepeatForever())
.Build();
context.Scheduler.RescheduleJob(new TriggerKey(context.Trigger.Key.Name, ((AbstractTrigger)context.Trigger).Group), rsiTrigger);
}
}
PS:
我正在使用 Quartz v2.6.1
是的,如果您有高于版本 3 的 Quartz 包版本,您可以重新调度或分配新触发器到现有调度程序或作业。(如果你有它通过 nuget 包管理器更新)。
例如:起初我在FireBaseJob类中声明了一个调度程序,例如:
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
public static void InitializeScheduler()
{
//Getting Defauls Scheduler Job
//Setting trigger time interval, ie. 3min here
int min = 3;
scheduler.Start();
IJobDetail jobDetail = JobBuilder.Create<FirebaseScheduler>().Build();
ITrigger trigger = TriggerBuilder.Create().WithIdentity("FireTrigger1", "FireJob1")
.StartNow().WithSimpleSchedule(s => s.WithIntervalInMinutes(min).RepeatForever()).Build();
scheduler.ScheduleJob(jobDetail, trigger);
}
您可以编写 api、function 或在正在运行的作业中,也可以重新安排作业(对我来说,正在运行的作业在FirebaseSceduler类中)。我创建了功能来做到这一点。
public ActionResult RescheduleJob()
{
try
{
var triggerBykeyGroup = FirebaseJob.scheduler.GetTrigger(new Quartz.TriggerKey("FireTrigger1", "FireJob1"));
int nextIntervalMinute = 5; // i am setting new trigger minute to 5 mins
TimeSpan newmin = new TimeSpan(0, nextIntervalMinute, 0);
//Updating trigger time interval in minutes
((Quartz.Impl.Triggers.SimpleTriggerImpl)triggerBykeyGroup.Result).RepeatInterval = newmin;
//Getting updated trigger result
var iTrigger = triggerBykeyGroup.Result;
TriggerKey triggerkey = iTrigger.Key;
//Starting paused job
FirebaseJob.scheduler.Start();
//rescheduling Job with updated trigger
FirebaseJob.scheduler.RescheduleJob(triggerkey, iTrigger);
}
catch(Exception ex)
{
}
return Json(new { success = true; });
}
执行该函数后,Trigger 会以 5min 的间隔运行一次。谢谢你。