我是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
)这真的取决于你想做什么工作!
这不是问题中列出的特定代码的直接答案,但在其他地方搜索时我没有注意到它,并认为这对未来的读者可能有用:
如果你有一个现有的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<TargetJob>()
.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);
}
在安排之前检查现有作业:
JobDetail job;
SimpleTrigger trigger;
//Create your trigger and job
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
if (scheduler.checkExists(job.getKey())){
scheduler.deleteJob(job.getKey());
}
scheduler.scheduleJob(job, trigger);
您可以通过将i作为静态int来创建新作业。而不是“工作”+我将是“工作”+ Integer.toString(i)。它对我有用。