如何在CronTrigger中更改cron表达式 (quartz 2.2,spring 4.1)

7

我在迁移到最新的quartz 2.2和spring 4.1时遇到了一些问题...以下是一个cron触发器,为了清晰起见,我省略了作业和其他细节:

...
       <bean id="timeSyncTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
         <property name="jobDetail" ref="timeSyncJob"/>
         <property name="startDelay" value="10000"/>
         <property name="cronExpression" value="0 0 1 * * ? *"/>
       </bean>
...

现在,我需要在运行时更改其,但这并不像我想象的那么简单。我无法引用bean并更改属性,因为它是一个工厂,提供了接口,该接口反过来不再具有方法,而是变成了不可变的。以前,我可以从上下文中找出触发器并设置其新的cron表达式。它在许多年里都运行得非常好,直到升级变得不可避免。

那么,今天我们如何完成这个简单的任务呢?完全迷失在文档和版本中...提前致谢!

2个回答

10

除了CronTriggerFactoryBean之外,您可能还有一个SchedulerFactoryBean,它提供对Quartz调度程序以及CronTrigger的访问。 Quartz调度程序允许您使用新的/修改后的触发器重新安排作业:

@Autowired private SchedulerFactoryBean schedulerFactoryBean;
...
public void rescheduleCronJob() {

    String newCronExpression = "..."; // the desired cron expression

    Scheduler scheduler = schedulerFactoryBean.getScheduler();
    TriggerKey triggerKey = new TriggerKey("timeSyncTrigger");
    CronTriggerImpl trigger = (CronTriggerImpl) scheduler.getTrigger(triggerKey);
    trigger.setCronExpression(newCronExpression );
    scheduler.rescheduleJob(triggerKey, trigger);
}

2

啊,那是一个愚蠢的问题,当然 CronTriggerFactoryBean 返回的是具有 setCronExpression() 方法的 CronTriggerImpl。我被 CronTrigger 接口搞混了,它不允许 setCronExpression。感谢提示! - Dima
@Dima,这对你确实有效吗?CronTriggerFactoryBean 似乎没有准备修改 cronExpression。也许是有意的,CronTrigger 接口没有 setCronExpression 方法。CronTriggerImpl.setCronExpression 也没有效果,不是吗? - Markus Pscheidt
1
@Markus 是的,我正在做你建议的基本相同的事情,只是稍有变化:StdScheduler工厂 = (StdScheduler)context.getBean("schedulerFactory"); CronTriggerImpl触发器 = context.getBean(triggerName, CronTriggerImpl.class); trigger.setCronExpression(expression); 日期 = 工厂.rescheduleJob(trigger.getKey(), trigger); - Dima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接