kus*_*mat 12 java cron scheduler quartz-scheduler job-scheduling
如何检查计划的Quartz cron作业是否正在运行?有任何API可以进行检查吗?
scheduler.getCurrentlyExecutingJobs()应该在大多数情况下工作.但请记住不要在Job类中使用它,因为它使用ExecutingJobsManager(一个JobListener)将正在运行的作业放到一个在作业类之前运行的HashMap,因此使用此方法检查作业正在运行肯定会返回true.一种简单的方法是检查火灾时间是否不同:
public static boolean isJobRunning(JobExecutionContext ctx, String jobName, String groupName)
throws SchedulerException {
List<JobExecutionContext> currentJobs = ctx.getScheduler().getCurrentlyExecutingJobs();
for (JobExecutionContext jobCtx : currentJobs) {
String thisJobName = jobCtx.getJobDetail().getKey().getName();
String thisGroupName = jobCtx.getJobDetail().getKey().getGroup();
if (jobName.equalsIgnoreCase(thisJobName) && groupName.equalsIgnoreCase(thisGroupName)
&& !jobCtx.getFireTime().equals(ctx.getFireTime())) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
另请注意,此方法不支持群集.也就是说,它只返回当前在此Scheduler实例中执行的作业,而不是整个集群中的作业.如果您在群集中运行Quartz,它将无法正常工作.
如果您注意到QUARTZ_TRIGGERS表中有一个TRIGGER_STATE列.这将告诉您特定作业的触发器状态(TriggerState).很可能你的应用程序没有这个表的直接接口,但是石英调度程序有,你可以这样检查状态:
private Boolean isJobPaused(String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobDetail.getKey());
for (Trigger trigger : triggers) {
TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
if (TriggerState.PAUSED.equals(triggerState)) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28764 次 |
| 最近记录: |