【问题标题】:How to reschedule the job execution interval in Quartz?如何重新安排 Quartz 中的作业执行间隔?
【发布时间】:2012-09-04 06:36:39
【问题描述】:

我对 Quartz 有点陌生。有没有办法更新已经提交的 Quartz 作业的作业执行间隔?这个间隔会立即更新吗?重新安排后是否必须重新开始工作?

我找到了以下链接,但我不知道代码引用了哪些库,因为我的石英罐不包含链接中使用的某些类。另外,triggerKey 方法是从哪里来的?这是某种静态导入吗?

http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/cookbook/UpdateTrigger.html

我想在我的一个 JUnit 测试用例中将作业执行间隔更新为一个非常大的数字,因为我不希望作业干扰被测类的状态。测试用例完成后,我想将作业执行间隔重置为将在生产中使用的实际值

【问题讨论】:

    标签: java quartz-scheduler


    【解决方案1】:

    您必须通过创建新触发器来重新安排作业。

    public void execute(JobExecutionContext context) throws JobExecutionException {
        Trigger newTrigger = what_ever_you_want;
        Trigger oldTrigger = context.getTrigger();
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.rescheduleJob(oldTrigger.getKey(), newTrigger);
    }
    

    这将用新的触发器触发时间替换相同的作业。

    【讨论】:

    • 那么旧触发器会发生什么......它会自动死亡?
    • @MiDhuN rescheduleJob 使用其密钥将其删除。
    • 通过这种方式似乎我必须等到作业执行此方法。为什么不创建单独的方法来重新安排如上所述的石英文档链接。
    【解决方案2】:

    也许 Quartz 库中某处有一个静态方法 triggerKey()。但是,我设法重新安排了现有的 Quartz 作业(使用 Quartz 2.3.2),而不使用这种(潜在的)方法,而是使用 TriggerKey 类,如下所示:

        boolean updateExisting = true; // try it also with false
        int aveId = 1234; // change it as you wish
        java.util.Date closeDate = new java.util.Date(); // change it as you wish
    
        SchedulerFactory sf = new StdSchedulerFactory("... /quartz_priority.properties");
        Scheduler scheduler = sf.getScheduler();
    
        TriggerKey triggerKey = new TriggerKey("trigger" + aveId, "group1");
    
        if (updateExisting) {
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
            TriggerBuilder oldTriggerBuilder = oldTrigger.getTriggerBuilder();
    
            Trigger newTrigger = oldTriggerBuilder.startAt(closeDate).build();
            scheduler.rescheduleJob(triggerKey, newTrigger);
    
        } else {
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startAt(closeDate).build();
    
            // Define job instance
            JobDetail job1 = JobBuilder.newJob(<YOUR_JOB_CLASS_NAME>.class).withIdentity("job" + aveId, "group1").build();
    
            JobDataMap map = job1.getJobDataMap();
            map.put(<PARAMETER_NAME>, aveId);
    
            // Schedule the job with the trigger
            scheduler.scheduleJob(job1, trigger);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多