【问题标题】:How to start a Job with several cron-triggers using the quartz-scheduler?如何使用石英调度程序启动具有多个 cron 触发器的作业?
【发布时间】:2015-06-07 08:54:20
【问题描述】:

我正在使用Quartz Scheduler 在我的 Java 应用程序中开始工作。我有工作HelloJob.java

package com.stackoverflow.test.java;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {

  private String message;

  public HelloJob() {
    Date akt = new Date();
    this.message = "Quartz is running (" + akt + ").";
  }

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    System.out.println(this.message);
  }

}

我想使用两个不同的 cron 表达式开始这项工作(这里:*/5 */3 * * * ?*/9 */2 * * * ?)。我尝试了以下方法:

package com.stackoverflow.test.java;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.JobBuilder;
import org.quartz.CronScheduleBuilder;


public class TestQuartz {

  public static void main(String[] args) {

    try {
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
      scheduler.start();

      /* ################################################################### */

      JobDetail job = JobBuilder
                      .newJob(HelloJob.class)
                      .withIdentity("job1", "group1")
                      .build();

      CronScheduleBuilder sb1 = CronScheduleBuilder
          .cronSchedule("*/5 */3 * * * ?");
      CronScheduleBuilder sb2 = CronScheduleBuilder
          .cronSchedule("*/9 */2 * * * ?");

      Trigger trigger = TriggerBuilder
          .newTrigger()
          .withIdentity("trigger1", "group1")
          .startNow()
          .withSchedule(sb1)
          .build();
      Trigger trigger2 = TriggerBuilder
          .newTrigger()
          .withIdentity("trigger2", "group1")
          .startNow()
          .withSchedule(sb2)
          .build();

      scheduler.scheduleJob(job, trigger);
      scheduler.scheduleJob(job, trigger2);

      /* ################################################################### */

      Thread.sleep(10 * 60 * 1000);
      System.out.println("FIN");

      /* ################################################################### */

      scheduler.shutdown();

    } catch (SchedulerException se) {
      se.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }
}

我收到以下异常:

org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'group1.job1', because one already exists with this identification.
    at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:279)
    at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:251)
    at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:886)
    at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
    at com.stackoverflow.test.java.TestQuartz.main(TestQuartz.java:47)

不可能用多个触发器启动一个作业吗?我能否以某种方式生成一个考虑多个 cron 表达式的计划?

【问题讨论】:

    标签: java cron quartz-scheduler


    【解决方案1】:

    您必须使用TriggerBuilderforJob(JobKey jobKey) 方法为作业分配更多触发器。

    Trigger trigger = TriggerBuilder.newTrigger().forJob(job.getKey()). ...
    scheduler.scheduleJob(trigger)
    

    在您的情况下,应用以下修改:

    /* ... */
    Trigger trigger2 = TriggerBuilder
        .newTrigger()
        .forJob(job.getKey())
        .withIdentity("trigger2", "group1")
        .startNow()
        .withSchedule(sb2)
        .build();
    /* ... */
    scheduler.scheduleJob(trigger2);
    /* ... */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2014-01-26
      • 2011-01-30
      相关资源
      最近更新 更多