我正在使用石英调度程序在不同的时间段向不同的报告发送错误消息。我创建了一个每小时运行一次的调度程序,它将执行第二个调度程序(此处显示的代码)。必须从数据库获取消息的发送时间,并在exp变量中传递。我只能获取数据库中第一行的值,并且还得到 org.quartz.ObjectAlreadyExistsException:无法存储Job:'q3Job.cronJob3',因为已经存在这个识别。 '错误。如何更正此错误?任何人都可以建议我采用正确的 安排计划 的方法吗?
QSchedule2班级
public class QSchedule2 implements Job {
private static Date date1 = null;
private static Date date2 = null;
private static String dateStart = "";
private static String dateStop = "";
public void execute(JobExecutionContext context) throws JobExecutionException {
q2();
}
public void q2() {
String exp = "";
try {
Class.forName(driverClassName);
con = DriverManager.getConnection(url, dbUsername, dbPassword);
dateStop = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(System.currentTimeMillis());
ps = con.prepareStatement(
"select report_name,frequency,emailDate from ErrorReport where sendReport='Yes'");
rs = ps.executeQuery();
while (rs.next()) {
dateStart = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(rs.getTimestamp(3));
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
date1 = format.parse(dateStart);
date2 = format.parse(dateStop);
long diff = date2.getTime() - date1.getTime();
long diffMinutes = diff / (60 * 1000) % 60;
String frequency = rs.getString(2);
int freq = Integer.parseInt(frequency);
if (diffMinutes >= freq) {
exp = "0 0/" + freq + " * 1/1 * ? *";
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = newJob(Q3.class).withIdentity("cronJob", "q3Job").build();
CronTrigger cronTrigger = newTrigger().withIdentity("trigger1", "q3Job")
.withSchedule(CronScheduleBuilder.cronSchedule(exp)).build();
scheduler.scheduleJob(job, cronTrigger);
scheduler.start();
} else {
System.err.println("No email sent");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
答案 0 :(得分:0)
乔布斯并没有神奇地被删除。要检查作业是否已知,可以使用checkExists()
方法。
当作业存在时,您可以验证触发器是否正确。如果是的话,不要做任何事情。如果不是,请更新触发器。