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

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

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

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 в методе, потому что, если я этого не сделаю, я получу: введите здесь описание изображения


person invzbl3    schedule 22.04.2019    source источник


Ответы (1)


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

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

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

person Alexander Pavlov    schedule 22.04.2019
comment
С null я полностью согласен, но если я перехожу как метод void с некоторой логикой, я получаю предупреждение. Я обновил свой вопрос. - person invzbl3; 22.04.2019
comment
Вы должны предоставить класс, потому что он нужен Quartz для создания экземпляра задания позже - person Alexander Pavlov; 22.04.2019
comment
Правильно ли я понимаю, что testMethod - это тело задания, которое вы хотите выполнить позже? - person Alexander Pavlov; 22.04.2019
comment
testMethod() - это метод, который я определяю внутри экземпляра задания вместо дополнительного класса. Я подумал, что могу пройти мимо, если не хочу создавать отдельно новый класс. Чтобы уточнить: у меня есть несколько классов с некоторой логикой, и, как я понимаю из документации, мне нужно создать новый класс для экземпляра задания, но я попытался проверить, могу ли я передать просто метод, а не другой класс. - person invzbl3; 22.04.2019
comment
Понимаю. Краткий ответ: вы не можете создать экземпляр лямбда-выражения, используя его класс, см. "> stackoverflow.com/questions/38490815/ - person Alexander Pavlov; 22.04.2019
comment
то есть Quartz всегда создает экземпляры сам по себе. Лямбды - это классы за кулисами, поэтому в идеальном мире вы могли бы ожидать, что вы можете определить лямбда, получить его класс, перейти к Quartz, и он создает экземпляр лямбда, используя свой класс, но это не идеальный мир, см. объяснение в ссылке выше - person Alexander Pavlov; 22.04.2019
comment
На самом деле, ответ полезен. Особенно в комментариях. Но не могли бы вы немного пояснить, как я понимаю, речь идет о разнице между передачей класса и метода внутри job instance, верно? Но что вы подразумеваете под instance в ответе? Пожалуйста, объясните. - person invzbl3; 22.04.2019
comment
MyJobClass.class - класс, new MyJobClass() экземпляр класса MyJobClass. Quartz принимает только ссылки на класс (например, MyJobClass.class), поэтому позже он может создать экземпляр задания (instance = MyJobClass.class.newInstance() и выполнить его. В Java вы не можете передать метод. Вы можете передать лямбду, которая является экземпляром автоматически сгенерированного класса. К сожалению, Java спроектирован таким образом, что даже если у лямбды есть класс, вы не можете создать новый экземпляр лямбды, используя lambda.class.newInstance() - person Alexander Pavlov; 22.04.2019