使用新触发器设置的Quartz.NET重新调度作业

时间:2013-05-02 09:19:42

标签: c# .net quartz-scheduler job-scheduling

我有一个Quartz作业,它安排了一组触发器,它有3到5分钟的执行时间。但是在将来的任何时候(可能是一周后或几分钟后)我可能需要使用新的触发器重新安排它。触发器集上会有一些添加或删除。

如何使用新的触发器设置重新安排作业?这里的诀窍是,我想确保当时没有任何工作实例,所以我可以可靠地重新安排工作。谢谢你的帮助...

3 个答案:

答案 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分钟的间隔内运行。谢谢。