Quartz动态修改cron表达式

Quartz的准备知识:

Scheduler 调度器。定时任务的管理器
  1. JobDetail 任务详情。一般用于创建任务
  2. Trigger 触发器。和任务一一对应。

知道这些就够了。下面是代码实现
  1. 调度器API,交给Spring管理。方便后期调用
    import org.quartz.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.PostConstruct;
    import java.util.TimeZone;
    
    @Service
    @Configuration
    @EnableScheduling
    public class QuartzService {
    
    
        @Autowired
        private Scheduler scheduler;
    
        @PostConstruct
        public void startScheduler() {
            try {
                scheduler.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 增加一个job
         *
         * @param jobClass     任务实现类
         * @param jobName      任务名称
         * @param jobGroupName 任务组名
         * @param jobTime      时间表达式 (这是每隔多少秒为一次任务)
         * @param jobTimes     运行的次数 (<0:表示不限次数)
         */
        public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobTime, int jobTimes) {
            try {
                // 任务名称和组构成任务key
                JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
                        .build();
                // 使用simpleTrigger规则
                Trigger trigger = null;
                if (jobTimes < 0) {
                    trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
                            .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime))
                            .startNow().build();
                } else {
                    trigger = TriggerBuilder
                            .newTrigger().withIdentity(jobName, jobGroupName).withSchedule(SimpleScheduleBuilder
                                    .repeatSecondlyForever(1).withIntervalInSeconds(jobTime).withRepeatCount(jobTimes))
                            .startNow().build();
                }
                scheduler.scheduleJob(jobDetail, trigger);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 增加一个job
         *
         * @param jobClass     任务实现类
         * @param jobName      任务名称
         * @param jobGroupName 任务组名
         * @param jobTime      时间表达式 (如:0/5 * * * * ? )
         */
        public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, String jobTime) {
            try {
                // 创建jobDetail实例,绑定Job实现类
                // 指明job的名称,所在组的名称,以及绑定job类
                // 任务名称和组构成任务key
                JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
                // 定义调度触发规则
                // 使用cornTrigger规则
                // 触发器key
                Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
                        .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND))
                        .withSchedule(CronScheduleBuilder.cronSchedule(jobTime).inTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))).startNow().build();
                // 把作业和触发器注册到任务调度中
                scheduler.scheduleJob(jobDetail, trigger);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 修改 一个job的 时间表达式
         *
         * @param jobName
         * @param jobGroupName
         * @param jobTime
         */
        public void updateJob(String jobName, String jobGroupName, String jobTime) {
            try {
                TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
                CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                        .withSchedule(CronScheduleBuilder.cronSchedule(jobTime).inTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))).build();
                // 重启触发器
                scheduler.rescheduleJob(triggerKey, trigger);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 删除任务一个job
         *
         * @param jobName      任务名称
         * @param jobGroupName 任务组名
         */
        public void deleteJob(String jobName, String jobGroupName) {
            try {
                scheduler.deleteJob(new JobKey(jobName, jobGroupName));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 暂停一个job
         *
         * @param jobName jobName
         * @param jobGroupName jobName
         */
        public void pauseJob(String jobName, String jobGroupName) {
            try {
                JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
                scheduler.pauseJob(jobKey);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 恢复一个job
         *
         * @param jobName jobName
         * @param jobGroupName jobGroupName
         */
        public void resumeJob(String jobName, String jobGroupName) {
            try {
                JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
                scheduler.resumeJob(jobKey);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    }

     

  2. 任务执行实体
    import com.ruoyi.common.core.utils.DateUtils;
    import com.ruoyi.system.service.ITbMaterialsPlanService;
    import org.quartz.JobExecutionContext;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class SomThingTimeJob extends QuartzJobBean {
    
        @Autowired
        private ITbMaterialsPlanService tbMaterialsPlanService;
    
        @Override
        protected void executeInternal(JobExecutionContext context) {
            System.out.println("《《《智能组盘》》》 " + DateUtils.getTime());
            //tbMaterialsPlanService.insertSmartPlan();
        }

     

  3. 任务监听
    @Component
    public class TimeScheduling implements ServletContextListener {
    
        @Autowired
        private QuartzService quartzService;
    
        @Autowired
        private ITbParamerService tbParamerService;
    
    
        /**
         * 启动添加定时任务
         *
         * @param sce
         */
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            String cron = tbParamerService.selectAutoPlanTime();
    
            System.out.println("新增定时任务" + cron);
            quartzService.addJob(SomThingTimeJob.class, "job1", "job1", "0/30 * * * * ?");
        }
    }

     

posted @ 2023-06-02 11:54  Mr.Duanxj  阅读(622)  评论(0)    收藏  举报