【问题标题】:Stop all jobs executed in the JobService Groovy停止在 JobService Groovy 中执行的所有作业
【发布时间】: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 完成了。

标签: java grails groovy


【解决方案1】:

我使用 DB(Grails 中的域)解决了这个问题。在方法sendMail()我有:

     def sendMail(correoList, nombreList){
                    int index = correoList.size()

                    try{
                        for(int i = 0; i < index; i++){
                            def tcp = TemplateControlPanelText.get(1)
                            if(!tcp.enviando){
                                break;  
                           }
                         .....
                     }
             }catch(Exception e){
        }
   }

一开始:

def startScheduler(){
        def t = TemplateControlPanelText.get(1)
        t.enviando = true
        t.save(flush:true)
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
      .....
}

最后,当我停止工作时:

public def stopScheduler(){
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();     
        TriggerKey triggerKey = TriggerKey.triggerKey("crontrigger","DB");
        scheduler.unscheduleJob(triggerKey);
        def t = TemplateControlPanelText.get(1)
        t.enviando = false
        t.save(flush:true)
    }

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多