如何使用quartz-scheduler使用多个cron-triggers启动Job?

文章描述了一个使用QuartzScheduler在Java应用程序中启动作业时遇到的问题。作者试图为HelloJob类创建两个具有不同cron表达式的触发器,但遇到了`ObjectAlreadyExistsException`,因为尝试为同一作业ID存储另一个作业。解决方案是使用`forJob(JobKeyjobKey)`方法为同一作业分配多个触发器。
摘要由CSDN通过智能技术生成

我正在使用Quartz Scheduler在我的Java-App中启动作业。 我有工作HelloJob.java

package com.stackoverflow.test.java;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {

private String message;

public HelloJob() {
Date akt = new Date();
this.message = “Quartz is running (” + akt + “).”;
}

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(this.message);
}

}

我想用两个不同的cron表达式开始这个工作(这里: */5 /3 * * * ?和/9 */2 * * * ? )。 我尝试了以下方法:

package com.stackoverflow.test.java;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.JobBuilder;
import org.quartz.CronScheduleBuilder;

public class TestQuartz {

public static void main(String[] args) {

try {
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  scheduler.start();

  /* ################################################################### */

  JobDetail job = JobBuilder
                  .newJob(HelloJob.class)
                  .withIdentity("job1", "group1")
                  .build();

  CronScheduleBuilder sb1 = CronScheduleBuilder
      .cronSchedule("*/5 */3 * * * ?");
  CronScheduleBuilder sb2 = CronScheduleBuilder
      .cronSchedule("*/9 */2 * * * ?");

  Trigger trigger = TriggerBuilder
      .newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
      .withSchedule(sb1)
      .build();
  Trigger trigger2 = TriggerBuilder
      .newTrigger()
      .withIdentity("trigger2", "group1")
      .startNow()
      .withSchedule(sb2)
      .build();

  scheduler.scheduleJob(job, trigger);
  scheduler.scheduleJob(job, trigger2);

  /* ################################################################### */

  Thread.sleep(10 * 60 * 1000);
  System.out.println("FIN");

  /* ################################################################### */

  scheduler.shutdown();

} catch (SchedulerException se) {
  se.printStackTrace();
} catch (InterruptedException e) {
  e.printStackTrace();
}

}
}

我收到以下异常:

org.quartz.ObjectAlreadyExistsException: Unable to store Job : ‘group1.job1’, because one already exists with this identification.
at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:279)
at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:251)
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:886)
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
at com.stackoverflow.test.java.TestQuartz.main(TestQuartz.java:47)

用几个触发器启动一个Job是不可能的? 我可以以某种方式生成一个考虑多个cron表达式的计划吗?

I’m using the Quartz Scheduler to start jobs in my Java-App. I have the job HelloJob.java

package com.stackoverflow.test.java;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {

private String message;

public HelloJob() {
Date akt = new Date();
this.message = “Quartz is running (” + akt + “).”;
}

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(this.message);
}

}

I’d like to start this job using two different cron expressions (here: */5 */3 * * * ? and */9 */2 * * * ?). I tried the following:

package com.stackoverflow.test.java;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.JobBuilder;
import org.quartz.CronScheduleBuilder;

public class TestQuartz {

public static void main(String[] args) {

try {
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  scheduler.start();

  /* ################################################################### */

  JobDetail job = JobBuilder
                  .newJob(HelloJob.class)
                  .withIdentity("job1", "group1")
                  .build();

  CronScheduleBuilder sb1 = CronScheduleBuilder
      .cronSchedule("*/5 */3 * * * ?");
  CronScheduleBuilder sb2 = CronScheduleBuilder
      .cronSchedule("*/9 */2 * * * ?");

  Trigger trigger = TriggerBuilder
      .newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
      .withSchedule(sb1)
      .build();
  Trigger trigger2 = TriggerBuilder
      .newTrigger()
      .withIdentity("trigger2", "group1")
      .startNow()
      .withSchedule(sb2)
      .build();

  scheduler.scheduleJob(job, trigger);
  scheduler.scheduleJob(job, trigger2);

  /* ################################################################### */

  Thread.sleep(10 * 60 * 1000);
  System.out.println("FIN");

  /* ################################################################### */

  scheduler.shutdown();

} catch (SchedulerException se) {
  se.printStackTrace();
} catch (InterruptedException e) {
  e.printStackTrace();
}

}
}

I receive the following exception:

org.quartz.ObjectAlreadyExistsException: Unable to store Job : ‘group1.job1’, because one already exists with this identification.
at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:279)
at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:251)
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:886)
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
at com.stackoverflow.test.java.TestQuartz.main(TestQuartz.java:47)

Is it impossible to start one Job with several triggers? Can I somehow generate a schedule that considers more than one cron expression?

更新时间:2023-01-31 14:01
最满意答案

您必须使用forJob(JobKey jobKey)方法为作业分配更多触发器。

Trigger trigger = TriggerBuilder.newTrigger().forJob(job.getKey()). …
scheduler.scheduleJob(trigger)

在您的情况下,应用以下修改:

/* … /
Trigger trigger2 = TriggerBuilder
.newTrigger()
.forJob(job.getKey())
.withIdentity(“trigger2”, “group1”)
.startNow()
.withSchedule(sb2)
.build();
/
/
scheduler.scheduleJob(trigger2);
/
… */

You have to use TriggerBuilder’s forJob(JobKey jobKey) method to assign further triggers to a job.

Trigger trigger = TriggerBuilder.newTrigger().forJob(job.getKey()). …
scheduler.scheduleJob(trigger)

In your case, apply the following modifications:

/* … /
Trigger trigger2 = TriggerBuilder
.newTrigger()
.forJob(job.getKey())
.withIdentity(“trigger2”, “group1”)
.startNow()
.withSchedule(sb2)
.build();
/
/
scheduler.scheduleJob(trigger2);
/
… */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值