0

I want to schedule cron at Runtime. I am fetching my cron list from database based on that list i want to schedule cron expression. Can some one help me out with this.

  package com.app.schedule.schedular; 
    import org.quartz.SchedulerException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    
    import com.app.schedule.controller.AlertController;
    import com.fasterxml.jackson.core.JsonProcessingException;
    
    @Configuration
    @EnableScheduling
    public class Schedular {
        
        @Autowired AlertController alertController;
    
        @Scheduled(cron = "0 23 17 * * ?")
        public void scheduleTaskUsingCronExpression() throws JsonProcessingException, SchedulerException {
         
                alertController.getAlertList();
        }
        
    }

1 Answers1

0

At runtime when you get your cron expression from database or cron expression modified,you need two steps to change cron task.The below code just for reference.

First call removeScheduler remove exist Scheduler use old cron expression,then use addScheduler add new Scheduler who use new cron expression from database.

public class ScheduleTaskManager {
    private Map<TriggerKey, Scheduler> schedulerMap = new ConcurrentHashMap<>();
    
    public void removeScheduler(String triggerName) throws Exception {
        Scheduler scheduler = schedulerMap.get(TriggerKey.triggerKey(triggerName));
        if (scheduler != null) {
            scheduler.shutdown();
            schedulerMap.remove(TriggerKey.triggerKey(triggerName));
        }
    }

    public void addScheduler(String triggerName, String cronExpression, JobDetail jobDetail) throws Exception {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        Trigger trigger = TriggerBuilder.newTrigger()
            .withIdentity(TriggerKey.triggerKey(triggerName))
            .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
            .build();
        scheduler.start();

        scheduler.scheduleJob(jobDetail, trigger);

        schedulerMap.put(TriggerKey.triggerKey(triggerName), scheduler);
    }
}
TongChen
  • 1,414
  • 1
  • 11
  • 21