首页 > 解决方案 > 我可以使用方法而不是类 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方法,因为如果我不这样做,我会得到: 在此处输入图像描述

标签: javaquartz-schedulerquartz

解决方案


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

Quartz 想自己管理工作,所以这就是为什么你只允许通过classinstance

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


推荐阅读