查找作业是否在Quartz1.6中运行

时间:2012-02-06 02:45:33

标签: quartz-scheduler

我想澄清Quartz1.6中scheduler.getCurrentlyExecutingJobs()方法的细节。我有一份工作,在任何特定时刻都应该只运行一个实例。它可以被触发从UI“立即运行”,但如果已经为此作业运行的作业实例 - 什么都不应该发生。

这就是我如何检查是否有一项让我感兴趣的工作:

    List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs();
    for (JobExecutionContext jobCtx: currentJobs){
    jobName = jobCtx.getJobDetail().getName();
    groupName = jobCtx.getJobDetail().getGroup();
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") &&
        groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) {
        //found it!
        logger.warn("the job is already running - do nothing");
    }               
}

然后,为了测试这个,我有一个单元测试,试图一个接一个地安排这个工作的两个实例。我希望在尝试安排第二份工作时看到警告,相反,我得到了这个例外:

org.quartz.ObjectAlreadyExistsException: Unable to store Job with name:
 'job_I_am_looking_for_name' and group: 'job_group_I_am_looking_for_name', 
 because one already exists with this identification.

当我在调试模式下运行此单元测试时,此行中断:

列出currentJobs = scheduler.getCurrentlyExecutingJobs();

我看到列表是空的 - 所以调度程序没有看到这个作业正在运行,但它仍然无法再次安排它 - 这告诉我当时的工作确实在运行......

我是否因使用此调度程序方法而错过了一些更精细的点?

谢谢!

码头

1 个答案:

答案 0 :(得分:18)

为了别人的利益,我正在回答我遇到的问题 - 我从兵马俑论坛的Zemian Deng得到了帮助:posting on Terracotta's forum

这是重新上限: 对运行工作的实际检查工作正常 - 当然,这只是单元测试的时间。我已经在工作中添加了一些睡眠,并调整了单元测试以安排第二个工作,而第一个工作仍然在运行 - 并且验证我确实可以找到第一个仍在运行的工作。

我得到的例外是因为我试图安排一个具有相同名称的新作业,而不是尝试触发已经存储在调度程序作业中的作业。以下代码完全符合我的要求:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs();
for (JobExecutionContext jobCtx: currentJobs){
    jobName = jobCtx.getJobDetail().getName();
    groupName = jobCtx.getJobDetail().getGroup();
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) {
        //found it!
        logger.warn("the job is already running - do nothing");
                 return;
    }               
}
      // check if this job is already stored in the scheduler
JobDetail emailJob;
emailJob = scheduler.getJobDetail("job_I_am_looking_for_name", "job_group_I_am_looking_for_name");
if (emailJob == null){
       // this job is not in the scheduler yet
  // create JobDetail object for my job 
  emailJob = jobFactory.getObject();
  emailJob.setName("job_I_am_looking_for_name");
  emailJob.setGroup("job_group_I_am_looking_for_name");
  scheduler.addJob(emailJob, true);             
}

// this job is in the scheduler and it is not running right now - run it now
scheduler.triggerJob("job_I_am_looking_for_name", "job_group_I_am_looking_for_name");

谢谢! 码头