我是Quartz的新手.我成功安装并运行它.但是当我第二次运行它时出现错误,因为该标识已存在该作业.
这是我的代码:
public void scheduleJobs() throws Exception { try { int i = 0; scheduler = new StdSchedulerFactory().getScheduler(); JobKey job1Key = JobKey.jobKey("job"+i, "my-jobs"+i); JobDetail job1 = JobBuilder .newJob(SimpleJob.class) .withIdentity(job1Key) .build(); TriggerKey tk1 = TriggerKey.triggerKey("trigger"+i, "my-jobs"+i); Trigger trigger1 = TriggerBuilder .newTrigger() .withIdentity(tk1) .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(11, 25)) .build(); scheduler.start(); // start before scheduling jobs scheduler.scheduleJob(job1, trigger1); i++; printJobsAndTriggers(scheduler); } catch (SchedulerException e) { LOG.error("Error while creating scheduler", e); } }
我试图使用整数i来更改名称,但它不起作用.你知道我该怎么办呢?非常感谢.
您可以:
检查"作业键"是否已存在,并在创建新作业之前删除现有作业:
scheduler.deleteJob(job1Key);
或者使用另一个键创建一个新作业(在您的情况下,每次执行时scheduleJobs()
,变量i
具有相同的值(0
)
或者只是重复使用相同的工作(如果旧工作仍然很好,你为什么要创建一份新工作)
或使用RAM作业存储,它不会在数据库中保留作业(每次使用软件时,您将有一个空的作业存储)
这真的取决于你想做什么工作!
这不是问题中列出的特定代码的直接答案,但在其他地方搜索时我没有注意到它,并认为这对未来的读者可能有用:
如果您处于现有状态 Job
但只想添加新内容 Trigger
,则可以致电:
scheduler.ScheduleJob(trigger);
它会添加Trigger
到Job
没有尝试重新创建Job
.唯一的问题是,你必须要确保Trigger
的JobKey
是正确的.
我对此交互的整体代码大致如下:
IJobDetail job; // Handed in
ITrigger trigger; // Handed in
// Keeping track of this because we need to know later whether it's new or not
var newJob = job == null;
if (newJob)
{
job = JobBuilder.Create()
.WithIdentity([whatever])
[.OtherConfiguration()]
.Build();
}
var trigger = TriggerBuilder
.Create()
.WithIdentity([whatever])
// ** Gotcha #1: Make sure it's linked to the job **
.ForJob(job.Key)
[.OtherConfiguration()]
.Build();
if (newJob)
{
_scheduler.ScheduleJob(job, trigger);
}
else
{
// ** Gotcha #2: Make sure you don't reschedule the job **
_scheduler.ScheduleJob(trigger);
}