java - Quartz为已经存在的工作添加触发器
问题描述
我正在使用石英框架来添加和安排作业和触发器。要求是为数据库中已经存在的作业动态添加触发器。当我试图用下面的代码实现这一点时,我得到了 org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'EBP1.AAA',因为这个标识已经存在。具有 JobGroup EBP1 的作业 AAA 已进入数据库。我只想为同一个工作添加新的触发器。请帮助如何实现这一目标。
String jobName = "AAA";
jobTrigger = jobName + "Trigger"+ (int )(Math.random() * 50 + 1);
String jobGroup = "EBP1";
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(jobTrigger, jobGroup).storeDurably()
.build();
if (scheduler.checkExists(JobKey.jobKey(jobName, jobGroup))) {
System.out.println("Job exist");
} else {
System.out.println("New job");
scheduler.addJob(jobDetail, true);
}
CronTrigger trigger1 = (CronTrigger)(newTrigger().withIdentity(jobTrigger, jobGroup).withDescription("default description").forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).startAt(futureDate(500, IntervalUnit.MILLISECOND)).build());
scheduler.scheduleJob(jobDetail, trigger1);
解决方案
快速提问:示例代码与您获得异常的代码完全相同吗?
或者,示例代码可能不完整,您需要对其进行更新。
无论如何,我认为您当前的示例代码中有一个错误
:
-您使用触发器的身份创建“jobDetail”,而不是“jobName”-withIdentity(jobTrigger, jobGroup)
要将新触发器添加到现有作业,请执行以下操作:
JobKey myJobKey = new JobKey(jobName, jobGroup);
CronTrigger trigger1 = (CronTrigger)(newTrigger().withIdentity(jobTrigger, jobGroup)
.withDescription("default description").forJob(myJobKey)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.startAt(futureDate(500, IntervalUnit.MILLISECOND))
.build());
scheduler.scheduleJob(trigger1);
2 参数方法的 JavaDocscheduler.scheduleJob(JobDetail, Trigger)
清楚地表明,
它将尝试根据提供的 JobDetail 创建作业
- 所以为什么你得到 ObjectAlreadyExistsException 是有道理的
推荐阅读
- python - 从 DataFrame 生成具有节点和边属性的图形
- java - fromHtml 方法在 API 级别 28 上无法正确格式化 html 文本
- c - 递归计算目录中的所有文件(包括子目录中的文件)
- android - 为什么按“返回”按钮后不调用 onSaveInstanceState()?
- css - 有没有办法进行幻灯片转换,使元素低于边框?
- html - 在 HTML 表格中输入信息
- three.js - AFrame - 片段着色器中的 sampler3D
- sql - 如何在 JOIN 之前使用 WHERE 子句过滤行?
- search - MarkLogic - 通配符搜索不返回结果
- php - 如何访问json数组