gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:20:52 26 4
gpt4 key购买 nike

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

最佳答案

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

关于java - 如何使用 quartz 调度程序启动具有多个 cron 触发器的作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29412324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com