无法存储作业,因为已存在具有此标识的作业

问题描述 投票:9回答:4

我是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来更改名称,但它不起作用。你知道我该怎么办呢?非常感谢。

java quartz-scheduler
4个回答
15
投票

您可以:

  • 检查“作业键”是否已存在,并在创建新作业之前删除现有作业: scheduler.deleteJob(job1Key);
  • 或者使用另一个键创建一个新作业(在您的情况下,每次执行scheduleJobs()时,变量i具有相同的值(0
  • 或者只是重复使用相同的工作(如果旧工作仍然很好,你为什么要创建一份新工作)
  • 或使用RAM作业存储,它不会在数据库中保留作业(每次使用软件时,您将有一个空的作业存储)

这真的取决于你想做什么工作!


6
投票

这不是问题中列出的特定代码的直接答案,但在其他地方搜索时我没有注意到它,并认为这对未来的读者可能有用:

如果你有一个现有的Job,但只是想添加一个新的Trigger,你可以打电话:

scheduler.ScheduleJob(trigger);

并且它将Trigger添加到Job而不试图重新创建Job。唯一的诀窍是你必须确保TriggerJobKey是正确的。

我对此交互的整体代码大致如下:

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);
}

1
投票

在安排之前检查现有作业:

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);

-1
投票

您可以通过将i作为静态int来创建新作业。而不是“工作”+我将是“工作”+ Integer.toString(i)。它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.