【问题标题】:Quartz Scheduler - Updating only the JobDataMap, between jobsQuartz Scheduler - 在作业之间仅更新 JobDataMap
【发布时间】:2013-04-11 14:41:51
【问题描述】:

我有一个 Quartz 作业,我可以使用一些 Cron Trigger 来安排它。

ReportSchedule reportSchedule = ... // my object
JobDetail jobDetail = new JobDetail(reportSchedule.getScheduleName(), 
                                    reportSchedule.getScheduleGroup(),
                                    ExtendedReportJob.class /* my job */);

jobDetail.getJobDataMap().put("reportSchedule", reportSchedule);
jobDetail.setDescription(reportSchedule.getScheduleDescription());
CronTrigger trigger = ...; // depends on the report schedule 

scheduler.scheduleJob(jobDetail, trigger); 

此代码成功地将作业和详细信息写入数据库。

reportSchedule 对象包含作业所需的特定参数。不过,我可能想更改参数。

我可以这样做

scheduler.deleteJob(name, group);
scheduler.scheduleJob(jobDetail, trigger); 
// where jobDetail.getJobDataMap() has the updated reportSchedule

但是,这样做会立即触发作业,因为触发取决于报告计划,我不想更改它(我想保留原始日期)。所以我的问题是:有没有办法在不改变Trigger 的情况下修改工作之间的JobDetail 或JobDataMap?

我使用的是 Quartz 1.6.0。

【问题讨论】:

    标签: java quartz-scheduler


    【解决方案1】:

    解决方案很简单,只要知道API即可。

    Scheduler 类有如下方法

    Scheduler#addJob(JobDetail, boolean);
    

    如果boolean 参数设置为true,则传递的JobDetail 将覆盖前一个。

    所以

    // name and group are the primary key of the job detail
    final JobDetail jobDetail = new JobDetail(name, group, ExtendedReportJob.class);
    
    // reportSchedule is the object I've previously modified
    jobDetail.getJobDataMap().put(ORStatics.REPORT_SCHEDULE, reportSchedule);
    jobDetail.setDescription(reportSchedule.getScheduleDescription());
    
    // overwrite the previous job, however retaining the triggers       
    scheduler.addJob(jobDetail, true);
    

    将更新持久存储中的作业详细信息。由于包含JobDetail 的表的主键将保持不变,我们不需要更改触发器。他们仍然会按计划执行。

    【讨论】:

    • 为此工作需要持久化,否则将抛出异常,默认情况下新作业不持久,因此需要通过在JobBuilder 上调用.storeDurably(true) 来设置它
    【解决方案2】:

    如何使用getTrigger(String triggerName, String triggerGroup) 获取触发器并将其存储在变量中。然后使用新的 jobDataMap 创建一个新作业并使用旧触发器?

    【讨论】:

    • 是的,我一开始就是这么做的。但是,当您安排新作业时,它会执行一些计算来更改触发器上的 NextFireTime,在我的情况下,它会将其设置为过去,从而重新触发它。我将在今天晚些时候发布我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多