web-dev-qa-db-ja.com

Quartz cronジョブが実行されているかどうかを確認するにはどうすればよいですか?

スケジュールされたQuartz cronジョブが実行されているかどうかを確認するにはどうすればよいですか?チェックを行うAPIはありますか?

12
kusumat

ほとんどの場合、scheduler.getCurrentlyExecutingJobs()が機能するはずです。ただし、ジョブクラスでは使用しないでください。ExecutingJobsManager(a JobListener)を使用して、実行中のジョブをジョブクラスの前に実行されるHashMapに配置するため、このメソッドを使用してジョブが実行中であることを確認すると、必ずtrueが返されます。簡単な方法の1つは、起動時間が異なることを確認することです。

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

また、このメソッドはクラスターに対応していないことにも注意してください。つまり、クラスター全体ではなく、このスケジューラインスタンスで現在実行されているジョブのみが返されます。クラスターでQuartzを実行すると、正常に動作しません。

7
arganzheng

QUARTZ_TRIGGERSテーブルに気づいた場合、TRIGGER_STATE列があります。これにより、特定のジョブのトリガーの状態( TriggerState )がわかります。ほとんどの場合、アプリにはこのテーブルへの直接インターフェースがありませんが、quartzスケジューラにはあり、この方法で状態を確認できます。

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;
}
7
ccu

これを見たことがありますか answer ?試してください:

scheduler.getCurrentlyExecutingJobs()

1
rafaborrego