#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()