我正在阅读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
答案 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