Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法存储作业,因为已存在具有此标识的作业_Java_Quartz Scheduler - Fatal编程技术网

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

Java 无法存储作业,因为已存在具有此标识的作业,java,quartz-scheduler,Java,Quartz Scheduler,我是石英的新手。 我成功地安装并运行了它。 但是,当我第二次运行它时,我有一个错误,因为该作业已经存在,并且具有此标识 这是我的代码: public void scheduleJobs() throws Exception { try { int i = 0; scheduler = new StdSchedulerFactory().getScheduler(); JobKey job1Key = JobKey.jobKey("jo

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

这是我的代码:

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作业存储,它不会将作业持久保存在数据库中(每次使用软件时,都会有一个空的作业存储)

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

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

如果您有一个现有的
作业
,但只想添加一个新的
触发器
,您可以调用:

scheduler.ScheduleJob(触发器);

它会将
触发器添加到
作业
,而无需重新创建
作业
。唯一的技巧是必须确保
触发器的
作业键
正确

我的整个交互代码大致如下所示:

IJobDetail作业;//已提交
ITrigger触发器;//已提交
//保持跟踪,因为我们需要稍后知道它是否是新的
var newJob=job==null;
如果(新工作)
{
job=JobBuilder.Create()
.WithIdentity([任何])
[.OtherConfiguration()]
.Build();
}
var trigger=TriggerBuilder
.Create()
.WithIdentity([任何])
//**明白了#1:确保它与工作相关**
.ForJob(job.Key)
[.OtherConfiguration()]
.Build();
如果(新工作)
{
_ScheduleJob(作业,触发器);
}
其他的
{
//**明白了#2:确保不要重新安排工作**
_ScheduleJob(触发器);
}

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

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

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

如果你们中的任何人面临相同的问题,并且您的解决方案是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));
    }
}
这就是我们如何配置作业的方法,请注意,我们正在检查作业是否已经存在,如果
wait 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();
}
private IJobDetail GetDailyJob(){
返回JobBuilder.Create(),使用标识(“dailyjob”、“dailygroup”).Build();
}
私有ITrigger GetDailyJobTrigger(){
返回TriggerBuilder.Create().WithIdentity(“dailytrigger”、“dailygroup”).StartNow().WithSimpleSchedule(x=>x.WithIntervalInHours(24.RepeatForever()).Build();
}

您可以从中获得完整的源代码。

谢谢您的回答。实际上,我不想将每个作业存储在我的数据库中。我在群集模式下使用quartz,每天00:00在tomcat上运行一个函数。因此,如果作业已经存在,我可以选择删除该作业,或者使用RAM作业存储,对吗?@Majestic,如果您在群集中ng模式,您不能使用RAM作业存储。请参阅非常感谢-我使用的是jdbcjobstore。