0

My question is that, when I execute a job from a controller with the following method:

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);
}   

Calling:

class SchedulerJobService implements Job {  
    private static final log = LogFactory.getLog(SchedulerJobService.class) 

    boolean transactional = true

    public void execute (JobExecutionContext jobExecutionContext) { 
       new SendMailController().sendMail()  
       }
    }

In the method sendMail() for loop is executed, sending a lot of mails, and when I execute stopScheduler():

public def stopScheduler(){
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        TriggerKey triggerKey = TriggerKey.triggerKey("crontrigger","DB");
        scheduler.unscheduleJob(triggerKey);
    }

The job stops, but the for in new SendMailController().sendMail() continue his work, until it is finally finished. How to stop it when I execute stopSceduler()?

1 Answers1

0

I resolve this with DB (Domain in Grails). In the method sendMail() I have:

     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){
        }
   }

And in the start:

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

And finally when I stop the job I have:

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)
    }