手动烧制石英作业

2022-09-03 04:30:06

我们在应用程序中配置了几个 Quartz 作业。在开发过程中,我们将石英调度程序置于待机状态 - 但是,我们有时希望手动启动作业(出于开发目的)。如果我调用 fireTrigger,它会告诉我需要启动调度程序。但是,如果我启动计划程序,它还会立即计划所有其他作业,这不是我想要的(因为它们可能会在我调试手动触发的作业时触发)。

我可以在启动调度程序时暂停所有触发器,但随后我必须处理失火指令等。

有没有一种简单的方法可以手动触发作业,而不必处理暂停和失火(即,即使调度程序处于待机状态也能正常工作的fireTrigger)?


答案 1

这是手动触发作业所需的循环:

SchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = stdSchedulerFactory.getScheduler();

// loop jobs by group
for (String groupName : scheduler.getJobGroupNames()) {
    // get jobkey
    for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
        String jobName = jobKey.getName();
        String jobGroup = jobKey.getGroup();
        scheduler.triggerJob(jobName, jobGroup);
    }
}

答案 2

在Quartz调度程序中注册的所有作业都由JobKey唯一标识,JobKey由名称和组组成。您可以通过调用计划程序实例立即触发具有给定 JobKey 的作业。triggerJob(JobKey jobKey)

// Create a new Job 
JobKey jobKey = JobKey.jobKey("myNewJob", "myJobGroup");
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity(jobKey).storeDurably().build();

// Register this job to the scheduler
scheduler.addJob(job, true);

// Immediately fire the Job MyJob.class
scheduler.triggerJob(jobKey);

注意:

  • 调度程序是在整个应用程序中使用的调度程序实例。它的 start() 方法在创建后应该已经调用。
  • 该作业是持久作业,无法向其附加任何触发器或 cron。它只能通过调用“triggerJob(JobKey jobKey)”以编程方式触发。

  • 推荐