【发布时间】:2014-11-05 17:11:44
【问题描述】:
我正在为 Quartz 的触发器而苦苦挣扎。我创建了一个通过 cron 表达式调用的服务,但它本身也是一个 org.quartz.Job,其背后的想法是,一旦调用该服务,我会检查一些变量并基于这些变量我决定延迟(或不延迟) ) 执行服务 1 天;为此,我得到DefaultScheduler,创建一个新的org.quartz.JobDetail 和一个org.quartz.SimpleTrigger,并安排它们。正如您可能猜到的那样,它不起作用,新的触发器永远不会启动。
public class MyService implements MyInterface, org.quartz.Job {
@Override
//method declared in MyInterface
public void generateFile() {
org.quartz.Scheduler scheduler;
try {
scheduler = org.quartz.impl.StdSchedulerFactory.getDefaultScheduler();
} catch (SchedulerException e1) {
scheduler = null;
}
if (condition) {
//regular processing
} else {
try {
org.quartz.JobDetail jobDetail;
SimpleTrigger simpleTrigger;
String name = "jobName";
if (scheduler != null && scheduler.isInStandbyMode()){
jobDetail = new org.quartz.JobDetail(name, org.quartz.Scheduler.DEFAULT_GROUP, MyService.class);
jobDetail.getJobDataMap().put("myService", this);
Calendar c = Calendar.getInstance();
int date = c.get(Calendar.DATE);
c.set(Calendar.DATE, date + 1);
simpleTrigger = new SimpleTrigger("simpleTrig", c.getTime());
simpleTrigger.setJobName(name);
jobDetail.setDurability(true);
scheduler.addJob(jobDetail, true);
scheduler.scheduleJob(simpleTrigger);
//also tested with
//scheduler.scheduleJob(jobDetail, simpleTrigger);
//and same result
scheduler.start();
}
else{
scheduler.shutdown();
}
} catch (java.text.ParseException e) {
}
catch (org.quartz.SchedulerException ex) {
}
}
}
@Override
public void execute(JobExecutionContext jobContext) throws JobExecutionException {
MyInterface jobParamLogService = (MyInterface)jobContext.getJobDetail().getJobDataMap().get("myService");
jobParamLogService.generateFile();
}
正如我所说,我的问题是 SimpleTrigger 永远不会被调用(当然,我已经测试了添加几分钟,而不是一天),有没有关于发生了什么的提示?
任何帮助将不胜感激。
【问题讨论】:
-
您应该做的第一件事是正确处理您的异常。由于问题,您可能不会将作业添加到调度程序。记录消息/堆栈跟踪或某些非常重要的东西
-
嗨@ChrisHinshaw,感谢您的评论,我向您展示的代码只是一个简化版本,我正在处理异常,但没有抛出任何异常
-
这里有两件事:1)你到底为什么要以如此复杂的方式查找你的服务实例,而可以直接调用
this.generateFile()(省略this.是一样的)2)为什么您使用对默认调度程序的静态调用,而您可以直接从提供给您的作业的 JobExecutionContext 访问实际调度程序?我的猜测是您的条件实际上是错误的,或者您访问了错误的调度程序,最终确实没有发生任何事情。 -
嗨@GuillaumePolet,感谢您的评论。关于第一个问题,可能你是对的,我没有意识到我可以打电话给
generateFile(),我不假思索地遵循了一个例子......关于你的第二个观察,我不知道 JobExecutionContext,但我认为这不是问题,实际上当我得到调度程序时,它是正确的,它包含作业和触发器 -
你为什么要测试
isInStandByMode()?由于您处于正在运行的作业中,因此这很可能总是错误的。先去掉那张支票。
标签: java triggers cron quartz-scheduler