【发布时间】:2015-03-11 08:49:20
【问题描述】:
我的问题是,当我使用以下方法从控制器执行作业时:
def startScheduler(){
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
///////////////////////////////
JobDetail job = JobBuilder.newJob(SchedulerJobService.class)
.withIdentity("SendMailJob","DB")
.build();
///////////////////////////////
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("crontrigger","DB")
.withSchedule(CronScheduleBuilder.cronSchedule(cronSce))
.build();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
调用:
class SchedulerJobService implements Job {
private static final log = LogFactory.getLog(SchedulerJobService.class)
boolean transactional = true
public void execute (JobExecutionContext jobExecutionContext) {
new SendMailController().sendMail()
}
}
在方法sendMail()中执行for循环,发送大量邮件,而当我执行stopScheduler()时:
public def stopScheduler(){
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey("crontrigger","DB");
scheduler.unscheduleJob(triggerKey);
}
工作停止,但new SendMailController().sendMail() 中的for 继续工作,直到最终完成。当我执行stopSceduler()时如何停止它?
【问题讨论】:
-
不,它不起作用。
-
您可以通过
JobExecutionContext设置调度程序。有一个调度器的方法——isShutdown()——看来你应该在一个循环中使用这个方法的结果并检查它是否改变了。 -
对于下一个问题我很抱歉,这可能很愚蠢,但是我如何以及在哪里可以通过
JobExecutionContext联系调度程序?我是否必须在class SchedulerJobService implements Job中实现更多方法,因为在调用stopScheduler()之后无法调用public void execute (JobExecutionContext jobExecutionContext) -
最后,我用 DB 完成了。