我想澄清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();
我看到列表是空的 - 所以调度程序没有看到这个作业正在运行,但它仍然无法再次安排它 - 这告诉我当时的工作确实在运行......
我是否因使用此调度程序方法而错过了一些更精细的点?
谢谢!
码头
答案 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");
谢谢! 码头