美文网首页
集成Quartz实现定时任务

集成Quartz实现定时任务

作者: 刘二先生说 | 来源:发表于2018-09-30 17:11 被阅读0次

    说明

    Quartz是一个任务调度框架,基于一定的时间规则实现某项定时任务。

    几个需要了解的对象:

    • Scheduler:任务调度器
    • Job:任务
    • jobDetail:任务的实例
    • Trigger:触发器,任务在什么时候会执行

    一、添加maven

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-quartz</artifactId>
            </dependency>
    

    二、添加一个任务

    public class UserJob extends QuartzJobBean {
    
        //任务传入的参数
        private Integer uid;
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        @Override
        protected void executeInternal(JobExecutionContext context)
                throws JobExecutionException {
            System.out.println(String.format("Hello %s!", this.uid));
        }
    }
    

    三、添加对任务的操作

    @Service
    public class QuartzUserService {
    
        private static final String JOB_GROUP = "event_job_group";
        private static final String TRIGGER_GROUP = "event_trigger_group";
    
        @Autowired
        private Scheduler scheduler;
    
        /**
         * 添加一个任务
         * 1、需要获取到任务调度器Scheduler
         * 2、定义jobDetail
         * 3、定义trigger
         * 4、使用Scheduler添加任务
         * @param user
         * @throws SchedulerException
         */
        public void addQuartz(User user) throws SchedulerException {
    
            //任务开始时间
            Date triggerDate = user.getStartTime();
    
            //定义jobDetail
            JobDetail job = JobBuilder.newJob(UserJob.class)
                    .withIdentity(user.getUid().toString(), JOB_GROUP)
                    .usingJobData("uid", user.getUid())
                    .build();
    
            //cron表达式 表示每隔i秒执行
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(String.format("0/%d * * * * ? ",10)).withMisfireHandlingInstructionDoNothing();
    
            //定义trigger
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(user.getUid().toString(), TRIGGER_GROUP)
                    .startAt(triggerDate)
                    .withSchedule(scheduleBuilder)
                    .build();
    
            //使用Scheduler添加任务
            scheduler.scheduleJob(job, trigger);
        }
    
        /**
         * 删除定时任务
         * 1、获取到定时任务调度器
         * 2、停止触发器
         * 3、删除触发器
         * 4、删除任务
         * @param uid
         */
        public void deleteJob(Integer uid) throws SchedulerException {
    
            //停止触发器
            TriggerKey triggerKey  = TriggerKey.triggerKey(uid.toString(), TRIGGER_GROUP);
            scheduler.pauseTrigger(triggerKey);
    
            //删除触发器
            scheduler.unscheduleJob(triggerKey);
    
            //删除任务
            JobKey jobKey = JobKey.jobKey(uid.toString(),JOB_GROUP);
            scheduler.deleteJob(jobKey);
    
        }
    
        /**
         * 修改一个任务
         * @param uid
         * @throws SchedulerException
         */
        public void updateJob(Integer uid) throws SchedulerException {
    
            //查询任务
            TriggerKey triggerKey = TriggerKey.triggerKey(uid.toString(), TRIGGER_GROUP);
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            if(trigger == null) {
                return;
            }
    
            //cron表达式 表示每隔i秒执行
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(String.format("0/%d * * * * ? ",8)).withMisfireHandlingInstructionDoNothing();
    
            //重新定义trigger
            trigger = TriggerBuilder.newTrigger()
                    .withIdentity(triggerKey)
                    .withSchedule(scheduleBuilder)
                    .build();
    
            //修改任务
            scheduler.rescheduleJob(triggerKey, trigger);
    
        }
    
        /**
         * 暂停所有的定时任务
         * @throws SchedulerException
         */
        public void standby() throws SchedulerException {
            scheduler.standby();
        }
    
        /**
         * 启动所有的定时任务
         * @throws SchedulerException
         */
        public void startJobs() throws SchedulerException {
            if(!scheduler.isShutdown()) {
                scheduler.start();
            }
        }
    
        /**
         * 关闭所有的定时任务
         * @throws SchedulerException
         */
        public void shutdownJobs() throws SchedulerException {
            if(!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        }
    
    }
    

    四、源码

    https://github.com/XShire/spring-boot-quartz.git

    相关文章

      网友评论

          本文标题:集成Quartz实现定时任务

          本文链接:https://www.haomeiwen.com/subject/kpbwoftx.html