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

时间:2015-12-09 10:29:32

标签: java quartz-scheduler

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

5 个答案:

答案 0 :(得分:15)

你可以:

  • 检查"工作键"已存在,并在创建新作业之前删除现有作业:

    scheduler.deleteJob(job1Key);

  • 或使用其他密钥创建新作业(在您的情况下,每次执行scheduleJobs()时,变量i都具有相同的值(0

  • 或者只是重复使用相同的工作(如果旧工作还不错,你为什么要创建一份新工作)

  • 或使用RAM作业存储,它不会在数据库中保留作业(每次使用您的软件时,您将有一个空的作业存储区)

这实际上取决于你想对你的工作做些什么!

答案 1 :(得分:6)

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

如果您遇到现有 Job,但只想添加 Trigger,则可以致电:

scheduler.ScheduleJob(trigger);

它会将Trigger添加到Job,而不会尝试重新创建Job。唯一的诀窍是你必须确保Trigger的{​​{1}}是正确的。

此次互动的整体代码大致如下:

JobKey

答案 2 :(得分:2)

在计划之前检查现有作业:

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

答案 3 :(得分:0)

如果任何人都面临相同的问题,并且您的解决方案是C#。这是解决此错误的方法。

这是我们配置调度程序的地方。

public async Task StartAsync(CancellationToken cancellationToken) {
    try {
        var scheduler = await GetScheduler();
        var serviceProvider = GetConfiguredServiceProvider();
        scheduler.JobFactory = new CustomJobFactory(serviceProvider);
        await scheduler.Start();
        await ConfigureDailyJob(scheduler);
    }
    catch(Exception ex) {
        _logger.Error(new CustomConfigurationException(ex.Message));
    }
}

这是我们可以配置作业的方式,请注意,我们正在检查作业是否已经存在,如果await scheduler.CheckExists(dailyJob.Key)返回true,我们将删除该作业信息并使用相同的信息创建一个新的键。

private async Task ConfigureDailyJob(IScheduler scheduler) {
    var dailyJob = GetDailyJob();
    if (await scheduler.CheckExists(dailyJob.Key)) {
        await scheduler.DeleteJob(dailyJob.Key);
        _logger.Info($ "The job key {dailyJob.Key} was already existed, thus deleted the same");
    }
    await scheduler.ScheduleJob(dailyJob, GetDailyJobTrigger());
}

有支持的私有功能。

private IJobDetail GetDailyJob() {
    return JobBuilder.Create < IDailyJob > ().WithIdentity("dailyjob", "dailygroup").Build();
}
private ITrigger GetDailyJobTrigger() {
    return TriggerBuilder.Create().WithIdentity("dailytrigger", "dailygroup").StartNow().WithSimpleSchedule(x = >x.WithIntervalInHours(24).RepeatForever()).Build();
}

您可以从this GitHub repository获取完整的源代码。

答案 4 :(得分:-1)

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