我要做的是从工作中删除触发器并为其分配一个全新的触发器。我限制我的用户只能为每个作业添加一个触发器。但是我想让他们选择删除该触发器并为同一个工作添加一个新的触发器。
为了不丢失我的工作信息,我将我的工作添加为durable
。
然后我找到与该作业相关联的触发器并使用
sched.UnscheduleJob(trigger.Key);
删除触发器(除非是durable
,否则也应该取消调度作业)。
现在我知道触发器已被删除,但我的工作仍在那里。 当我尝试使用
将新触发器添加到此作业时sched.ScheduleJob(job, newTrigger);
我收到错误:
无法存储作业:无法存储作业:'MYGROUP.MYJOB',因为一个 已存在这种识别。
这就是我所知道的,但我仍然希望将新触发器与这项工作联系起来。
为什么会这样?如何在不删除旧作业的情况下将新触发器添加到旧作业中?
答案 0 :(得分:3)
这是一个相当常见的错误;您可以告诉,调用sched.ScheduleJob(job, newTrigger)
会尝试将JobDetail
重新插入QRTZ_JOB_DETAILS表。这会导致约束违规,因为表的主键是调度程序名称JobKey
和JobGroup
的组合。 Quartz在内部巧妙地处理这个问题,并为您提供有意义的错误,而不仅仅是报告主键冲突。
解决方案实际上就像用新的触发器替换旧触发器一样简单。
ITrigger newTrigger = TriggerBuilder.Create()
.WithCronSchedule(newExpression)
.WithIdentity(newTriggerKey)
.StartNow()
.Build();
sched.RescheduleJob(existingTrigger.Key, newTrigger);