Quartz Scheduler suddenly stop running and no exception error

后端 未结 6 1615
攒了一身酷
攒了一身酷 2021-01-01 11:13

I have some quartz job which was running everyday at 7pm. Suddenly it failed to run. I check my server.log and there are no exception thrown. Anyone have any idea what could

6条回答
  •  情话喂你
    2021-01-01 11:49

    I had a similar problem and unfortunately, none of the above answers helped me to figure out my problem. I am using quartz-2.3.2 version. First of all, i agree with some others, wherein most of the cases the scheduler not fired up, is caused due to threads race conditions which blocked and try to acquire the flag from the thread entered the critical zone and it does not release it. This simply smells a kind of bad code but anyway, i don't want to say again the same thing like the others did.I want to come up with my solution to give you the way on which i fixed the problem.

    Assuming you use a Cron scheduler like the following way i will provide a detailed example

    this is the SimpleJob class

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.quartz.JobKey;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.Date;
    
    public class SimpleJob implements Job {
    
        private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);
    
        public SimpleJob() {
        }
    
        public void execute(JobExecutionContext context)
                throws JobExecutionException {
    
            // This job simply prints out its job name and the
            // date and time that it is running
            JobKey jobKey = context.getJobDetail().getKey();
            _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
        }
    
    }
    

    This is your main class

    import org.quartz.CronTrigger;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.impl.StdSchedulerFactory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import static org.quartz.CronScheduleBuilder.cronSchedule;
    import static org.quartz.JobBuilder.newJob;
    import static org.quartz.TriggerBuilder.newTrigger;
    
    public class CronTriggerExample {
    
        public void run() throws Exception {
            Logger log = LoggerFactory.getLogger(CronTriggerExample.class);
    
            log.info("------- Initializing -------------------");
    
            // First we must get a reference to a scheduler
            JobDetail job = newJob(SimpleJob.class)
                    .withIdentity("job1", "group1").build();
    
            CronTrigger trigger = newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(cronSchedule("10 10/5 * ? * *").withMisfireHandlingInstructionFireAndProceed())
                .build();
            Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.start();
            scheduler.scheduleJob(job, trigger);
        }
    
        public static void main(String[] args) throws Exception {
    
            CronTriggerExample example = new CronTriggerExample();
            example.run();
        }
    }
    

    The below cron expression means At second :10, every 5 minutes starting at minute :10, of every hour.

    cronSchedule("10 10/5 * ? * *")
    

    If you notice the most interesting part here is the

    withMisfireHandlingInstructionFireAndProceed()
    

    This is the key to solve your problem if your trigger is felt in a misfire situation, it instructs your scheduler to be fired immediately. An alternative occasion is to use

    withMisfireHandlingInstructionDoNothing()
    

    where upon a mis-fire situation the cronTrigger will be next fired at the started time which the scheduler is set on. For example in our case in At second :10, every 5 minutes starting at minute :10, of every hour.

提交回复
热议问题