java - 来自 jobkey 的 Quartz jobdetail 为空

标签 java quartz-scheduler

我有以下两种方法,

initialJob();
otherJobs();

其他作业只需在初始作业完成后开始。

这是初始作业方法。
private void initialJob(){
JobDetail jobDetail = JobBuilder.newJob(RestTriggerForQuartzJobs.class)
                          .withIdentity("INITIAL_JOB_NAME", TRIGGER_GROUP)
                          .usingJobData("PARAM", "")
                          .build();               
   Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).startNow().build();
   scheduler.scheduleJob(jobDetail, trigger);
}

我在这里检查初始工作是否完成。如果没有,递归调用相同的方法直到它完成
private void otherJobs(){
   if(isJobComplete("INITIAL_JOB_NAME")){
   JobDetail jobDetail = JobBuilder.newJob(RestTriggerForQuartzJobs.class)
                          .withIdentity("JOB_NAME", TRIGGER_GROUP)
                          .usingJobData("PARAM", "")
                          .build();               
   Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).startNow().build();
   scheduler.scheduleJob(jobDetail, trigger);
   }else{
   otherJobs();
   }
}

在 isComplete 方法中,JobDetail jobDetail = scheduler.getJobDetail(jobKey) 的 jobDetail 为空,尽管我可以在 quartz 触发器表中看到 DEFAULT.INITIAL_JOB_NAME。
private Boolean isJobComplete(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.COMPLETE.equals(triggerState)) {
                return true;
            }
        }
        return false;
    }

最佳答案

方法scheduler.getJobDetail(jobKey)返回 null 因为 JobKey由名称和组组成,以便唯一标识作业。

这意味着您必须启动您的 JobKey带有名称和 :

private Boolean isJobComplete(String jobName) throws SchedulerException {
    JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP);
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    ...

另一个提示:调用方法 otherJobs递归地不确定时间可能导致 StackOverflowError .也许 listeners对您的用例很有用。

关于java - 来自 jobkey 的 Quartz jobdetail 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48353343/

相关文章:

java - 根据当前经过身份验证的用户的角色返回不同的 JSON 对象

java - quartz 调度程序线程池示例

java - 单击 RecyclerView 项目后禁用按钮时出现问题

java - 如何将数字转换为ascii值或字符并存储在字符串数组中

java - 为什么对数组组件赋值的类型检查是在运行时完成的?

java - 当对象的状态发生变化时如何通知 JSP?

logging - Quartz 一直将它的日志放在我所有的日志文件中

java - 有没有办法指定使用 Quartz 库运行任务的持续时间

web-applications - 如果应用程序停止, quartz 调度程序将获取下一个调度程序时间

java - 使用 Spring 框架的 Quartz JobStore