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

时间:2019-04-22 18:17:09

标签: java quartz-scheduler quartz

我正在阅读Quartz How can I find the product GUID of an installed MSI setup?,并试图了解我可以在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,因为如果不这样做,我会得到: documentation

1 个答案:

答案 0 :(得分:1)

您的testMethod()方法返回null。 Quartz不接受null并失败。

Quartz希望自己管理作业,这就是为什么只允许您通过class而不通过instance的原因。

为什么需要提供自己的实例?如果要使其在执行之间保持状态“持久”,那么Quartz提供了stateful job概念,请参见http://www.quartz-scheduler.org/api/2.3.0/org/quartz/StatefulJob.html