Quartz没有触发简单的触发器

时间:2013-02-13 17:10:51

标签: java cron quartz-scheduler

这应该很直接,但我看不到任何工作被执行。我在任务的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文件,所以有可能没有创建石英线程池。因此,在documentation中读取时,我使用StdSchedulerFactory替换了代码,其中包含以下内容:

DirectSchedulerFactory.getInstance().createVolatileScheduler(10);
Scheduler s = DirectSchedulerFactory.getInstance().getScheduler();
猜猜是什么?还没有运气。同样的效果。应用程序保持活着,触发不触发。

1 个答案:

答案 0 :(得分:13)

我找到了解决方案:将定义作业(打印机)的类的可见性更改为 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());
    }

}

这是可以理解的,因为它只能传递<? extends Job>.class 调度程序(血腥地狱,为什么??)而不是 - 例如 - 匿名对象。

说完了,我发现Quartz在没有单一错误消息的情况下默默地无法解雇工作的方式让人感到不安。