@Bean public TaskScheduler poolScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setThreadNamePrefix("poolScheduler"); scheduler.setPoolSize(10); return scheduler;

或者在运行类TaskApplication添加上 @EnableScheduling 注解。
(2)主角登场,添加定时任务

  • 简单方式:修改定时任务的执行周期;
  • 按正常来讲,修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?哈哈,那是必须的必。

    import com.hczt.haier.task.service.UserTaskService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import javax.annotation.Resource;
     * 用户菜单定时设置
    @Slf4j
    @Component
    public class UserMenuTask {
        @Resource
        private UserTaskService userTaskService;
         * 每天一点进行同步
        @Scheduled(cron = "0 0 1 * * *")
        public void setUserMenu(){
            log.info("-----Start Set User Menus -----");
            userTaskService.timeSetMenus();
            log.info("-----End Set User Menus -----");
    
  • 动态修改定时任务的执行周期;
  • 首先我们先会回顾下,我们之前是使用了@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。那么如何动态修改呢,我们看下步骤:

    ① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
    ② 设置一个静态的cron,用于存放任务执行周期参数。
    ③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。
    ④ 设置任务触发器,触发任务执行。
    本项目是基于spring data jpa的,数据检索使用的是repository,具体创建数据表:

    CREATE TABLE `t_scheduled_task_cron` (
        `task_cron_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id自增',
        `task_code` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '定时任务编码',
        `task_name` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '定时任务名称',
        `task_package` VARCHAR(400) NULL DEFAULT '' COMMENT '定时任务包名',
        `task_cron` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '定时任务执行表达式',
        `task_cron_description` VARCHAR(400) NOT NULL DEFAULT '',
        `remark` VARCHAR(400) NULL DEFAULT NULL COMMENT '备注',
        PRIMARY KEY (`task_cron_id`)
    COMMENT='定时任务执行时间存储表'
    COLLATE='utf8mb4_general_ci'
    ENGINE=InnoDB
    import javax.persistence.*;
     * 精诚所至,金石为开。
     * 石の上にも三年;陽気の発する所金石亦透る。
     * Faith moves mountains.
     * @author marvin.ma
     * @create 2018-06-28 22:35
     * @desc 定时任务表达式实体
    @Data
    @Entity
    @Table(name = "t_scheduled_task_cron")
    public class ScheduledTaskCron {
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "task_cron_id")
        private String taskCronId;
        private String taskCode;
        private String taskName;
        private String taskPackage;
        private String taskCron;
        private String taskCronDescription;
        private String remark;
    

    创建repository

    import com.hczt.haier.db.user.entity.ScheduledTaskCron;
    import org.springframework.data.jpa.repository.JpaRepository;
     * 精诚所至,金石为开。
     * 石の上にも三年;陽気の発する所金石亦透る。
     * Faith moves mountains.
     * @author marvin.ma
     * @create 2018-06-28 22:37
     * @desc 定时任务表达式dao
    public interface ScheduledTaskCronRepository extends JpaRepository<ScheduledTaskCron, String> {
        ScheduledTaskCron findByTaskCode(String taskCode);
    

    创建定时任务

    import com.hczt.haier.db.user.entity.ScheduledTaskCron; import com.hczt.haier.db.user.repository.ScheduledTaskCronRepository; import com.hczt.haier.task.service.UserTaskService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; * 精诚所至,金石为开。 * 石の上にも三年;陽気の発する所金石亦透る。 * Faith moves mountains. * @author marvin.ma * @create 2018-06-28 13:27 * @desc 动态表达式定时任务 @Component public class DynamicScheduledTask implements SchedulingConfigurer { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); private static final String DEFAULT_CRON = "0/5 * * * * ?"; private String cron = DEFAULT_CRON; @Autowired private ScheduledTaskCronRepository scheduledTaskCronRepository; @Autowired private UserTaskService userTaskService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { Runnable task = new Runnable() { @Override public void run() { // 定时任务的业务逻辑 System.out.println("动态修改定时任务cron参数,当前时间:" + dateFormat.format(new Date())); userTaskService.timeSetMenus(); Trigger trigger = new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { // 定时任务触发,可修改定时任务的执行周期 ScheduledTaskCron scheduledTaskCronEntity = scheduledTaskCronRepository.findByTaskCode("1"); if (null == scheduledTaskCronEntity || StringUtils.isEmpty(scheduledTaskCronEntity.getTaskCron())) { cron = DEFAULT_CRON; CronTrigger trigger = new CronTrigger(cron); Date nextExecDate = trigger.nextExecutionTime(triggerContext); return nextExecDate; taskRegistrar.addTriggerTask(task, trigger); public void setCron(String cron) { this.cron = cron;