Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用quartz调度程序启动具有多个cron触发器的作业?_Java_Cron_Quartz Scheduler - Fatal编程技术网

Java 如何使用quartz调度程序启动具有多个cron触发器的作业?

Java 如何使用quartz调度程序启动具有多个cron触发器的作业?,java,cron,quartz-scheduler,Java,Cron,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 { pr

我正在使用启动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表达式的计划?

您必须使用
TriggerBuilder
forJob(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);
/* ... */