我可以使用方法而不是 class Quartz 来定义作业实例吗?

Can I define job instance using method instead of class Quartz?

我正在阅读 Quartz documentation 并试图了解我能否在内部传递 Job 实例方法而不是 class。

例如,如果 class 我需要写:

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.

更新: 我 return null 在方法中,因为如果我不这样做,我会得到:

你的 testMethod() 方法 returns null。 Quartz 不接受 null 并失败。

Quartz 想要自己管理作业,所以这就是为什么你只能通过 class 而不能通过 instance

为什么需要提供自己的实例?如果你想让它 "persistent" 在执行之间保持状态,那么 Quartz 提供了 stateful job 概念,请参阅 http://www.quartz-scheduler.org/api/2.3.0/org/quartz/StatefulJob.html