Получение ключа работы от имени класса работы в Кварце - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу удалить работу, для которой мне нужен ключ работы. Я знаю только название класса работы. Пожалуйста, предложите, как получить то же самое, используя имя класса работы.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы можете получить JobKey несколькими способами. Давайте представим, что ваша Job реализация - MyJob class.

  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;
    

Надеюсь, это поможет!

0 голосов
/ 03 сентября 2018

Вы можете найти эту информацию, если перебираете все рабочие группы ваших экземпляров планировщика. Оттуда вы получите 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...