7

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

如何使用新的触发器集重新安排作业?这里的诀窍是,我想确保此时没有工作实例处于活动状态,因此我可以可靠地重新安排我的工作。谢谢你的帮助...

4

3 回答 3

3

我记得,你可以这样做:

List<JobExecutionContext> context = scheduler.GetCurrentlyExecutingJobs()

迭代列表并调用 GetJobInstance()(或类似的方法)来查找为其创建上下文的作业,然后检查它是否是您感兴趣的作业。如果不是,您可以使用相同的触发器重新安排。尝试这样的事情:

Trigger trigger = Global.scheduler.GetTrigger("testTrigger","triggerGroup");

trigger.set(); 

Global.scheduler.RescheduleJob(trigger.JobName, trigger.JobGroup, trigger);
于 2013-05-02T18:14:12.920 回答
1

我重新安排了 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

于 2018-01-15T12:22:42.603 回答
0

是的,如果您有高于版本 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 的间隔运行一次。谢谢你。

于 2020-08-23T12:34:43.580 回答