首页 文章

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

提问于
浏览
1

我成功地设置了一个双节点调度程序集群来执行作业 . 我使用 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 回答

  • 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触发器轻松获得此功能 .

相关问题