Quartz.net故障转移设置:首次运行作业不正确

时间:2014-02-01 11:52:26

标签: c# quartz-scheduler quartz.net

我成功设置了一个双节点调度程序集群来执行作业。我使用 OracleODP-20 连接器连接到oracle数据库,其中创建了 QRTZ _ 表。预定的作业也会由调度员中的任何一个每5分钟执行一次。

这是我的触发器:

ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
                                                          .WithIdentity("mytrigger", schedId)
                                                          .StartNow()
                                                          .WithSimpleSchedule(x => x.WithRepeatCount(-1).WithInterval(TimeSpan.FromMinutes(5)))
                                                          .Build();

但是有一个问题。当调度程序启动时,它总是执行 这项工作,即使下次执行工作的时间不是现在。

例如,

  • Job1将每5分钟运行一次。
  • Scheduler1从10.00开始 执行Job1并等待10.05以进行下一次执行。
  • 当我在10.01启动Scheduler2时,即使Job1应该这样做 运行下一个10.05,它将运行在10.01

在初始运行之后,Job1将仅由一个调度程序执行,并且运行良好。

但我不知道该怎么说 Scheduler2,该作业已由Scheduler1执行,并且直到下一次触发时才执行。

对此有何帮助?

1 个答案:

答案 0 :(得分:1)

您应该只创建一次此触发器,而不是每个节点的启动。

我看到你触发包含实例的id作为非常可疑的组。如果您还没有创建单个触发器,那么您似乎正在触发每个节点。

更容易阅读触发器定义因此:

ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();

var jobDetail = JobBuilder.Create<NoOpJob>().Build();

var key = new TriggerKey("trigger-name", "trigger-group");
if (sched.GetTrigger(key) == null)
{
    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity(key)
        .StartAt(DateBuilder.EvenHourDate(DateTimeOffset.UtcNow))
        .WithSimpleSchedule(x => x
            .RepeatForever()
            .WithInterval(TimeSpan.FromMinutes(5)))
        .Build();

    sched.ScheduleJob(jobDetail, trigger);
}

我投入了均匀的小时日期来获得更精确的时间,而不是“从现在开始每5分钟”。您也可以使用cron触发器轻松获得此功能。