美文网首页
Spring-Task的使用

Spring-Task的使用

作者: 念_ae7b | 来源:发表于2018-11-01 17:33 被阅读0次

    动态修改cron表达式

    @RestController
    @Component
    public class DynamicTask {
        /**
         * 线程池任务调度类,能够开启线程池进行任务调度。
         */
        @Autowired
        private ThreadPoolTaskScheduler threadPoolTaskScheduler;
    
        /**
         * 定时计划ScheduledFuture
         */
        private ScheduledFuture<?> future;
    
    
        @Bean
        public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
            return new ThreadPoolTaskScheduler();
        }
    
    
        /**
         * ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,
         * 在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)
         */
        @RequestMapping("/startCron")
        public String startCron() {
            future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));
            System.out.println("DynamicTask.startCron()");
            return "startCron";
        }
    
    
        /**
         * 在ScheduledFuture中有一个cancel可以停止定时任务。
         * 参数为true便可以停止
         * @return
         */
        @RequestMapping("/stopCron")
        public String stopCron() {
            if (future != null) {
                future.cancel(true);
            }
            System.out.println("DynamicTask.stopCron()");
            return "stopCron";
        }
    
        @RequestMapping("/changeCron10")
        public String startCron10() {
            stopCron();// 先停止,在开启.
            future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));
            System.out.println("DynamicTask.startCron10()");
            return "changeCron10";
        }
    
    
        private class MyRunnable implements Runnable {
            @Override
            public void run() {
                System.out.println("DynamicTask.MyRunnable.run()," + new Date());
    }
        }
    
    }
    

    通过数据库修改表达式

    • 在数据库中建一张表cron

    属性:cron_id,cron

    • 建立一个和表对应的持久化类

    @Data
    @Entity
    public class Cron {
        @GeneratedValue
        @Id
        private Integer cronId;
    
        private String cron;
    
        public Cron() {
    
        }
    
        public Cron(String cron) {
            this.cron = cron;
        }
    }
    
    • 写一个CronRepository接口

    public interface CronRepository extends JpaRepository<Cron,Integer>{
    
    }
    
    • 实现

    @Configuration
    @EnableScheduling
    public class CompleteScheduleConfig implements SchedulingConfigurer {
        // 0/5 * * * * *
        // */10 * * * * *
        @Resource
        private CronRepository cronRepository;
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            scheduledTaskRegistrar.addTriggerTask(
                    //1.添加任务内容(Runnable)
                    () -> System.out.println("执行定时任务2: " + LocalDateTime.now().toLocalTime()),
                    //2.设置执行周期(Trigger)
                    triggerContext -> {
                        //2.1 从数据库获取执行周期
                        String cron = cronRepository.findById(23).get().getCron();
                        //2.2 合法性校验.
                        if (StringUtils.isEmpty(cron)) {
                            // Omitted Code ..
                        }
                        //2.3 返回执行周期(Date)
                        return new CronTrigger(cron).nextExecutionTime(triggerContext);
                    }
            );
    
        }
    }
    

    相关文章

      网友评论

          本文标题:Spring-Task的使用

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