簡體   English   中英

如何使用quartz-scheduler使用多個cron-triggers啟動Job?

[英]How to start a Job with several cron-triggers using the quartz-scheduler?

我正在使用Quartz Scheduler在我的Java-App中啟動作業。 我有工作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)

用幾個觸發器啟動一個Job是不可能的? 我可以以某種方式生成一個考慮多個cron表達式的計划嗎?

你必須使用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);
/* ... */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM