12

这应该很简单,但我没有看到正在执行的工作。我在任务的 execute() 方法上有一个断点,没有线程到达那里。我不明白出了什么问题。

工作

class Printer implements Job{
    public Printer(){
        System.out.println("created printer");
    }

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println("hi" + context.getFireTime());
    }

}

主要班

class MyClass {
      public static void main(String[] args) throws Throwable {
            Scheduler s = StdSchedulerFactory.getDefaultScheduler();
            JobDetail job = newJob(Printer.class).build();
            CronTrigger trigger = 
                    newTrigger()
                    .withIdentity("a", "t")
                    .withSchedule(cronSchedule("0/5 * * * * ?").inTimeZone(TimeZone.getDefault()))
                    .forJob(job).build();
            s.scheduleJob(job, trigger);

// This prints the right date!

            System.out.println(trigger.getNextFireTime()); 
            s.start();
        }
}

编辑:我发现我没有quartz.property 文件,因此有可能从未创建石英的线程池。因此,如文档中所述,我将使用 StdSchedulerFactory 的代码替换为以下内容:

DirectSchedulerFactory.getInstance().createVolatileScheduler(10);
Scheduler s = DirectSchedulerFactory.getInstance().getScheduler();

你猜怎么了?还是没有运气。一样的效果。应用程序保持活动状态,触发不触发。

4

1 回答 1

18

我找到了解决方案:将定义作业(打印机)的类的可见性更改为public将使 Quartz 可以访问它并运行它。

public class Printer implements Job { // just add 'public'!
    public Printer() {
        System.out.println("created printer");
    }

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println("hi" + context.getFireTime());
    }

}

这是可以理解的,因为只能将 a 传递<? extends Job>.class 给调度程序(该死的,为什么??)而不是 - 例如 - 匿名对象。

话虽如此,我发现 Quartz 在没有一条错误消息的情况下默默地失败触发作业的方式真的令人不安。

于 2013-02-19T09:41:58.627 回答