有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我刚接触石英。 我成功地安装并运行了它。 但是,当我第二次运行它时,我出现了一个错误,因为该作业已经存在,并且具有此标识

这是我的代码:

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


共 (2) 个答案

  1. # 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);
    
  2. # 2 楼答案

    如果你们中有人面临同样的问题,而你的解决方案是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获得完整的源代码