石英不触发简单触发器

Posted

技术标签:

【中文标题】石英不触发简单触发器【英文标题】:Quartz not firing simple trigger 【发布时间】:2013-01-29 07:45:32 【问题描述】:

这应该很简单,但我没有看到正在执行的工作。我在任务的 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();

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

【问题讨论】:

你的程序不就终止了吗? 不,因为我没有关闭调度程序(故意)。 您是否确实确认您的应用程序不会简单地在s.start() 之后结束? 我确认它还活着。如果我将 s.shutdown() 作为最后一条指令,它会立即终止。我的测试程序的早期版本包括十分钟的睡眠,然后是 s.shutdown()。效果是进程在 10m 后终止。但为了简单起见,我发表了没有。我测试了任何一种方式。我想这是预期的行为。 顺便说一句,对于阅读本文的任何人,即使您不提供quartz.properties 文件,Quartz 也会加载默认属性。查看文档here 【参考方案1】:

我找到了解决方案:将定义作业(打印机)的类的可见性更改为 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 在没有一条错误消息的情况下默默地失败触发作业的方式真的很令人不安。

【讨论】:

另一个问题可能是构造器是否需要参数或不公开。多亏了你,我找到了我的问题。 我遇到了同样的问题。我也觉得很奇怪/令人沮丧的是根本没有给出错误消息...... 你成就了我的一天! 你有没有发现为什么 Quartz 默默地失败了解雇工作?我面临同样的问题,无法解释原因,因为它在绝大多数时间都有效。 从 v2.3.0 documentation: "...jobs 必须有一个无参数的构造函数(使用默认 JobFactory 实现时)"

以上是关于石英不触发简单触发器的主要内容,如果未能解决你的问题,请参考以下文章

石英调度程序无法获取触发器

如何为 cron 触发器处理石英夏令时的用户时区?

Quartz Scheduler +HSQLDB 巨大的 .lobs 文件。尺寸永远增加

从数据库关闭石英作业调度

如何在发送推送通知期间关闭计算机时处理 Quartz 触发器

触发器啥时候使用?有啥功能?举个简单的例子说明一下。