簡體   English   中英

如何檢查 Quartz cron 作業是否正在運行?

[英]How to check whether Quartz cron job is running?

如何檢查預定的 Quartz cron 作業是否正在運行? 是否有任何 API 可以進行檢查?

scheduler.getCurrentlyExecutingJobs() 應該在大多數情況下工作。 但是切記不要在Job類中使用它,因為它使用ExecutingJobsManager(a JobListener)將正在運行的Job放到一個HashMap中,它在Job類之前運行,所以用這個方法檢查Job是否正在運行肯定會返回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;
}

另請注意,此方法不具有集群感知能力。 也就是說,它只會返回當前在此 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;
}

你看過這個答案嗎? 嘗試:

scheduler.getCurrentlyExecutingJobs()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM