石英不触发简单触发器

问题描述 投票:0回答:2

这应该非常简单,但我看到没有任何工作被执行。我在任务的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 文件,因此有可能从未创建quartz 的线程池。因此,正如在documentation中所读到的,我用以下内容替换了使用StdSchedulerFactory的代码:

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

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

java cron quartz-scheduler
2个回答
19
投票

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


0
投票

为我解决这个问题的方法是将 Job 类设置为static,包括Job 使用的对象。就我而言,我正在制作一个 Discord 机器人,并希望每天在 X 时间展示一些新闻。

public class BotListeners extends ListenerAdapter {

private JDA jda = null;
private static TextChannel generalChannel;
private static TextChannel newsChannel;
private static UoiScraper scraper;

/* Other methods we dont care about */



public static class NewsJob implements Job{
    public NewsJob(){
        System.out.println("Creating job");
    }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException{
        newsChannel.getIterableHistory().forEach(message -> message.delete().queue());
        scraper.presentNewsForDiscord(newsChannel);
    }
}

public void sendDailyNews() throws SchedulerException {
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    scheduler.start();

    JobDetail scrapeNewsJob = JobBuilder.newJob(NewsJob.class)
            .withIdentity("presentNewsForDiscordJob", "group1")
            .build();

    //trigger every day at 12:58
    Trigger trigger = TriggerBuilder.newTrigger()
            .withIdentity("presentNewsForDiscordTrigger", "group1")
            .withSchedule(CronScheduleBuilder.cronSchedule("0 55 4 * * ?"))
            .build();
    System.out.println("News will be renewed in " + trigger.getStartTime());

    scheduler.scheduleJob(scrapeNewsJob, trigger);
}
© www.soinside.com 2019 - 2024. All rights reserved.