如何使用石英调度程序启动具有多个 cron 触发器的作业?
How to start a Job with several cron-triggers using the quartz-scheduler?
我正在使用 Quartz Scheduler 在我的 Java-App 中开始工作。我有工作 HelloJob.java
package com.Whosebug.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.Whosebug.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.Whosebug.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);
/* ... */
我正在使用 Quartz Scheduler 在我的 Java-App 中开始工作。我有工作 HelloJob.java
package com.Whosebug.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.Whosebug.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.Whosebug.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);
/* ... */