我成功设置了一个双节点调度程序集群来执行作业。我使用 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将仅由一个调度程序执行,并且运行良好。
但我不知道该怎么说 Scheduler2,该作业已由Scheduler1执行,并且直到下一次触发时才执行。
对此有何帮助?
答案 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触发器轻松获得此功能。