【问题标题】:Can I define job instance using method instead of class Quartz?我可以使用方法而不是 Quartz 类来定义作业实例吗?
【发布时间】:2019-04-22 18:17:09
【问题描述】:

我正在阅读 Quartz documentation 并试图了解我可以通过 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,因为如果我不这样做,我会得到:

【问题讨论】:

    标签: java quartz-scheduler quartz


    【解决方案1】:

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

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

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

    【讨论】:

    • null 我完全同意,但如果我以void 方法通过一些逻辑,那么我会收到警告。我更新了我的问题。
    • 必须提供类,因为 Quartz 稍后需要它来实例化作业
    • 我是否正确理解testMethod 是您要稍后执行的作业主体?
    • 即Quartz 总是自己实例化实例。 Lambda 是幕后的类,所以在理想世界中,您可以期望您可以定义 lambda,获取它的类,传递给 Quartz 并使用它的类实例化 lambda,但这不是理想世界,请参阅上面链接中的解释
    • MyJobClass.class - 是类,new MyJobClass() 是 MyJobClass 类的实例。 Quartz 只接受对类的引用(例如MyJobClass.class),因此稍后它可以实例化作业实例(instance = MyJobClass.class.newInstance() 并执行。在 Java 中,您不能“传递方法”。您可以传递 lambda,它是自动生成的类的实例。不幸的是,Java设计的方式是即使 lambda 有类,您也不能使用 lambda.class.newInstance() 创建新的 lambda 实例
    猜你喜欢
    • 2011-12-03
    • 2012-02-15
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多