这应该非常简单,但我看到没有任何工作被执行。我在任务的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();
你猜怎么着?还是没有运气。一样的效果。应用程序保持活动状态,触发而不触发。
我找到了解决方案:将定义作业(打印机)的类的可见性更改为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 默默地失败触发作业而没有任何错误消息的方式确实令人不安。
为我解决这个问题的方法是将 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);
}