Java 如何使用quartz调度程序启动具有多个cron触发器的作业?
我正在使用启动Java应用程序中的作业。我有这个工作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
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);
/* ... */