当前位置: 首页 > 知识库问答 >
问题:

如何使用Quartz-Scheduler启动带有多个cron触发器的作业?

欧渝
2023-03-14

我正在使用Quartz调度器在我的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);
  }

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

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

共有1个答案

蓝恩
2023-03-14

必须使用TriggerBuilderforjob(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);
/* ... */
 类似资料:
  • 我想知道是否有一个函数/方法来创建随机时间触发的作业。我的意思是,如果我设置一个cron计划在每周一上午10:00触发,并给出一个时间间隔,比方说30分钟,触发器将总是在9:30到10:30之间关闭。例如,这是cron调度表。

  • 我正在使用Java中的Quartz调度程序来运行cron作业。这是我第一次使用这个框架运行cron作业,所以我有些困惑。 我跟随本教程是为了更好地理解如何使用Quartz框架。 如果JobA每周运行,那么它应该打印出和。但是如果JobA每个月都在运行,那么它应该打印出和所以下一个问题是--有没有什么方法,我们可以在运行JobA时向它传递参数?

  • 问题内容: 计划从设置cron作业转移到Quartz Scheduler。使用Quartz而不是设置cron有什么优点/缺点? 问题答案: 我用过并且喜欢石英。这是石英的一些优点 如果使用基于OS的cron,则jvm会升降,并且任何状态都将丢失。 它是便携式的(可以在没有cron的Win OS上运行) 您可以在石英中安排多个线程 我们在tomcat中运行调度程序,因此我们可以通过管理网页来管理和查

  • 我的路线计划每月在凌晨1:00运行一次,如果我的应用程序在这段时间内关闭,就会出现问题,所以我想在应用程序启动时运行该作业。 它使用时间段(如果服务重新启动,作业将运行),但不使用cron表达式。 我试过使用以下方法,但没有成功。 从(“quartz2://scheduler?cron=0 45 15 1 1/1?”? 有人能让我知道,如果我错过了什么。

  • 如何使用quartz 1.6.2根据动态接收的参数和开始日期和时间调度和执行此方法。我是一个新的石英调度器,我不知道如何做这一点。有没有人帮我用你的示例程序?