Могу ли я определить экземпляр задания, используя метод вместо класса Quartz?

#java #quartz-scheduler #quartz

#java #quartz-планировщик #quartz

Вопрос:

Я читаю документацию по Quartz и пытаюсь понять, могу ли я передать внутри метода экземпляра задания вместо класса.

Например, в случае с классом мне нужно написать:

 public class MyJobClass implements Job {

    public MyJobClass() {
        // Instances of Job must have a public no-argument constructor.
    }

    public void execute(JobExecutionContext context)
            throws JobExecutionException {

        JobDataMap data = context.getMergedJobDataMap();
        System.out.println("someProp = "   data.getString("someProp"));
    }    
}
  

И определение экземпляра задания, такого как:

 JobDetail job1 = newJob(MyJobClass.class) // what about method here
    .withIdentity("job1", "group1")
    .usingJobData("someProp", "someValue")
    .build();
  

По тому же принципу я попытался определить метод передачи экземпляра задания, например:

 // define the job
JobDetail job = newJob(testMethod())
               .withIdentity("job1", "group1")
               .build();
  

И метод выглядит как:

 private Class<? extends Job> testMethod() {
    //...  
    return null;
}
  

Но я получаю ошибку:

 java.lang.IllegalArgumentException: Job class cannot be null.
  

Обновлено:
Я возвращаюсь null в метод, потому что, если я этого не сделаю, я получу:
введите описание изображения здесь

Ответ №1:

Ваш testMethod() метод возвращает null . Quartz не принимает значение null и завершается сбоем.

Quartz хочет управлять заданиями самостоятельно, поэтому вам разрешено передавать только class not instance .

Зачем вам нужно предоставлять свой собственный экземпляр? Если вы хотите сделать его «постоянным» для сохранения состояния между исполнениями, тогда Quartz предоставляет stateful job концепцию, см. http://www.quartz-scheduler.org/api/2.3.0/org/quartz/StatefulJob.html

Комментарии:

1. С null я полностью согласен, но если я передаю как void метод с некоторой логикой, то я получаю предупреждение. Я обновил свой вопрос.

2. Вы должны предоставить класс, потому что кварцу это нужно для создания экземпляра задания позже

3. Правильно ли я понимаю, что testMethod это тело задания, которое вы хотите выполнить позже?

4. т. Е. Quartz всегда создает экземпляры сам по себе. Лямбды — это классы за сценой, поэтому в идеальном мире вы могли бы ожидать, что вы можете определить lambda, получить его класс, передать в Quartz, и он создает экземпляр lambda, используя свой класс, но это не идеальный мир, см. Объяснение по ссылке выше

5. MyJobClass.class — является классом, new MyJobClass() является экземпляром класса MyJobClass. Quartz принимает только ссылки на класс (например MyJobClass.class ), поэтому позже он может создать экземпляр задания ( instance = MyJobClass.class.newInstance() и выполнить. В Java вы не можете «передать метод». Вы можете передать lambda, который является экземпляром автоматически сгенерированного класса. К сожалению, Java разработана таким образом, что даже если у lambda есть класс, вы не можете создать новый экземпляр lambda с помощью lambda.class.newInstance()