我有一个Quartz作业,它安排了一组触发器,它有3到5分钟的执行时间。但是在将来的任何时候(可能是一周后或几分钟后)我可能需要使用新的触发器重新安排它。触发器集上会有一些添加或删除。
如何使用新的触发器设置重新安排作业?这里的诀窍是,我想确保当时没有任何工作实例,所以我可以可靠地重新安排工作。谢谢你的帮助...
答案 0 :(得分:3)
我记得,你可以这样做:
List<JobExecutionContext> context = scheduler.GetCurrentlyExecutingJobs()
迭代列表并调用GetJobInstance()(或类似的东西)来查找创建上下文的作业,然后检查它是否是您感兴趣的作业。如果不是,您可以使用相同的触发器重新安排。尝试这样的事情:
Trigger trigger = Global.scheduler.GetTrigger("testTrigger","triggerGroup");
trigger.set();
Global.scheduler.RescheduleJob(trigger.JobName, trigger.JobGroup, trigger);
答案 1 :(得分:0)
我已将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
答案 2 :(得分:0)
是的,如果您的Quartz软件包版本高于版本3,则可以将其重新调度或将新的触发器分配给现有的调度程序或作业。 (如果确实有,它会更新nuget软件包的maneger)。
例如:最初,我在类 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,函数或在正在运行的作业中编写代码,也可以重新安排作业的时间(对我而言,正在运行的作业在 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; });
}
执行此功能后,触发器将在5分钟的间隔内运行。谢谢。