从Quartz中的工作类别名称获取工作密钥

时间:2018-09-03 09:46:44

标签: java quartz-scheduler quartz

我想删除需要我的工作钥匙的工作。我只知道职位名称。请提出如何使用工作类别名称获得相同的信息。

2 个答案:

答案 0 :(得分:1)

如果遍历调度程序实例的所有作业组,则可以找到此信息。从那里您获得jobKey。使用jobKey可以要求jobDetail,其中包含类信息。如果匹配,请返回密钥。

public JobKey getJobKeyByJobClass (Scheduler scheduler, String className){  
    for (final String group : scheduler.getJobGroupNames()) {
        for (final JobKey jobKey : scheduler.getJobKeys(org.quartz.impl.matchers.GroupMatcher.groupEquals(group))) {
            if(className.equals(scheduler.getJobDetail(jobKey).getJobClass().getName())){
                return jobKey;
            }                               
        }
    }
    return null;
}

答案 1 :(得分:1)

您可以通过多种方式获得JobKey。假设您的Job实现是MyJob类。

  1. 来自JobExecutionContext。如果您的工作正在执行,您可以

    Scheduler scheduler = schedulerFactory.getScheduler(); 
    JobKey jobKey = null;
    for (JobExecutionContext jobCtx : scheduler.getCurrentlyExecutingJobs()) {
        JobDetail jobDetail = jobCtx.getJobDetail();
        if (MyJob.class.equals(jobDetail.getJobClass())) {
            jobKey = jobDetail.getKey();
            break;
        }
    } 
    

    与流相同

    Scheduler scheduler = schedulerFactory.getScheduler(); 
    Optional<JobDetail> job = scheduler.getCurrentlyExecutingJobs()
                  .stream()
                  .map(JobExecutionContext::getJobDetail)
                  .filter(jobDetail -> MyJob.class.equals(jobDetail.getJobClass()))
                  .findFirst();
    JobKey jobKey = job.isPresent() ? job.get().getKey() : null;
    
  2. 按组名。通常,当您提交要执行的新作业时,会提供组名和作业名。如果您不这样做,请从头开始,它将使事情变得容易:)

    Scheduler scheduler = schedulerFactory.getScheduler();
    JobKey jobKey = null;
    for (JobKey jk : scheduler.getJobKeys(GroupMatcher.jobGroupEquals("myGroup"))) {
        if (MyJob.class.equals(scheduler.getJobDetail(jk).getJobClass())) {
            jobKey = jk;
            break; 
        }
    }
    

    与流相同

    Scheduler scheduler = schedulerFactory.getScheduler(); 
    Optional<JobDetail> job = scheduler.getJobKeys(GroupMatcher.jobGroupEquals("myGroup"))
                  .stream()
                  .map(jk -> scheduler.getJobDetail(jk))
                  .filter(jobDetail -> MyJob.class.equals(jobDetail.getJobClass()))
                  .findFirst();
    JobKey jobKey = job.isPresent() ? job.get().getKey() : null;
    

希望有帮助!