【问题标题】:Quartz add trigger for already existing jobQuartz为已经存在的工作添加触发器
【发布时间】:2019-04-09 06:14:45
【问题描述】:

我正在使用石英框架来添加和安排作业和触发器。要求是为数据库中已经存在的作业动态添加触发器。当我试图用下面的代码实现这一点时,我得到了 org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'EBP1.AAA',因为这个标识已经存在。具有 JobGroup EBP1 的作业 AAA 已进入数据库。我只想为同一个工作添加新的触发器。请帮助如何实现这一目标。

String jobName = "AAA";
jobTrigger = jobName + "Trigger"+ (int )(Math.random() * 50 + 1);
String jobGroup = "EBP1";

JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(jobTrigger, jobGroup).storeDurably()
                    .build();
            if (scheduler.checkExists(JobKey.jobKey(jobName, jobGroup))) {
                System.out.println("Job exist");
            } else {
                System.out.println("New job");
                scheduler.addJob(jobDetail, true);
            }

            CronTrigger trigger1 = (CronTrigger)(newTrigger().withIdentity(jobTrigger, jobGroup).withDescription("default description").forJob(jobDetail)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).startAt(futureDate(500, IntervalUnit.MILLISECOND)).build());

            scheduler.scheduleJob(jobDetail, trigger1);

【问题讨论】:

    标签: java quartz-scheduler job-scheduling quartz crontrigger


    【解决方案1】:

    快速提问:示例代码与您获得异常的代码完全相同吗?
    或者示例代码可能不完整,您需要更新它。

    无论如何,我认为您当前的示例代码中存在一个错误
    - 您使用触发器的身份创建“jobDetail”,而不是“jobName” - withIdentity(jobTrigger, jobGroup)

    要将新触发器添加到现有作业,请执行以下操作:

    JobKey myJobKey = new JobKey(jobName, jobGroup);
    
    CronTrigger trigger1 = (CronTrigger)(newTrigger().withIdentity(jobTrigger, jobGroup)
        .withDescription("default description").forJob(myJobKey)
        .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
        .startAt(futureDate(500, IntervalUnit.MILLISECOND))
        .build());
    
    scheduler.scheduleJob(trigger1);
    

    2 参数方法的 JavaDoc scheduler.scheduleJob(JobDetail, Trigger) 明确表示,
    它将尝试创建基于提供的 JobDetail 的作业
    - 所以为什么你得到 ObjectAlreadyExistsException 是有道理的

    【讨论】:

      【解决方案2】:

      你能换吗

                  scheduler.scheduleJob(jobDetail, trigger1);
      

      用下面的再试一次

                  scheduler.scheduleJob(trigger1);
      

      【讨论】:

      • 我试过了,但这个解决方案不起作用。 scheduler.scheduleJob(jobDetail, triggerList, true);在 triggerList 为 Set . 的地方工作
      【解决方案3】:
      1. 通过 for job 方法构建触发器并与作业关联
      2. 使用此触发器计划作业
      CronTrigger cronTrigger = TriggerBuilder.newTrigger()
      .withIdentity(trigger.getName(),trigger.getGroup())
      .withSchedule(cronScheduleBuilder)
      .forJob(trigger.getJobName(),trigger.getJobGroup())
      .build();
           
      scheduler.scheduleJob(cronTrigger);
      

      【讨论】:

        猜你喜欢
        • 2016-03-08
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        相关资源
        最近更新 更多