基于Spring Task的Spring定时任务

简介: 基于Spring Task的Spring定时任务

基于Spring Task的Spring定时任务

1 使用@Scheduled注解

举例:

/**
 * @desc: 基于注解的Spring定时任务
 * @author: YanMingXin
 * @create: 2021/9/28-16:25
 **/
@Configuration
@EnableScheduling
public class SpringScheduleTask {
    /**
     * cron方式
     */
    @Scheduled(cron = "*/5 * * * * ?")
    private void configureTasks1() {
        System.err.println("定时任务1......");
    }
    /**
     * fixedRate方式
     */
    @Scheduled(fixedRate = 1)
    private void configureTasks2() {
        System.out.println("定时任务2......");
    }
}
复制代码

注意:fixedRate和cron不可以同时使用

1.1 cron方式

字段含义

  • *:代表全部可能的值
  • -:指定范围例如1-4
  • ,:表示或 例如在分钟里,"5,15"表示5分钟和20分钟触发
  • W:只能用在月份中,表示最接近指定天的工作日
  • #:用在星期中表示这个月的第几个周几,例如5#3表示这个月的第3个周五
  • /:表示增量 例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次
  • ?:表示没有具体的值
  • L:表示last,在星期中表示周日,月份中表示最后一天,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五

网络异常,图片无法展示
|


示例

*/5 * * * * ? 每隔5秒执行一次

0 */1 * * * ? 每隔1分钟执行一次

0 0 5-15 * * ? 每天5-15点整点触发

0 0/3 * * * ? 每三分钟触发一次

0 * * * * ? 每1分钟触发一次

0 0 * * * ? 每天每1小时触发一次

0 0 10 * * ? 每天10点触发一次

0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

1.2 fixedRate方式

配合timeUnit参数,例如

@Scheduled(fixedRate = 1,timeUnit = TimeUnit.SECONDS)
private void configureTasks2() {
    System.out.println("定时任务2......");
}
复制代码

TimeUnit的枚举类型主要有

  • DAYS :天
  • HOURS :小时
  • MINUTES :分钟
  • SECONDS :秒钟
  • MILLISECONDS :毫秒
  • MICROSECONDS :微秒
  • NANOSECONDS:纳秒

1.3 @Scheduled注解源码

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
   String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED;
   String cron() default "";  //配置cron参数
   String zone() default "";  //配置时区
   long fixedDelay() default -1;
   String fixedDelayString() default "";
   long fixedRate() default -1;
   String fixedRateString() default "";
   long initialDelay() default -1;
   String initialDelayString() default ""; //
   TimeUnit timeUnit() default TimeUnit.MILLISECONDS; //配置时间单位,默认毫秒
}
复制代码

2 实现SchedulingConfigurer接口

2.1 代码实现

/**
 * @desc: 实现SchedulingConfigurer接口来实现定时任务
 * @author: YanMingXin
 * @create: 2021/9/28-17:12
 **/
@Configuration
@EnableScheduling
public class SpringScheduleTaskImpl implements SchedulingConfigurer {
    /**
     * 实现自定义任务
     *
     * @param taskRegistrar
     */
    @SuppressWarnings("all")
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
                    System.out.println("定时任务3......");
                },
                triggerContext -> {
                    return new CronTrigger("0/1 * * * * ?").nextExecutionTime(triggerContext);
                });
        taskRegistrar.addFixedRateTask(() -> {
                    System.out.println("定时任务4......");
                },
                1000
        );
        taskRegistrar.addCronTask(() -> {
                    System.out.println("定时任务5......");
                },
                "0/1 * * * * ?"
        );
    }
}
复制代码

2.2 配置文件方式

配置文件:

server.port=0
task.cron=0/2 * * * * ?
复制代码

代码:

/**
 * @desc: 实现SchedulingConfigurer接口来实现定时任务
 * @author: YanMingXin
 * @create: 2021/9/28-17:12
 **/
@Configuration
@EnableScheduling
public class SpringScheduleTaskImplByFile implements SchedulingConfigurer {
    @Value("${task.cron}")
    private String cron;
    /**
     * 实现自定义任务
     *
     * @param taskRegistrar
     */
    @SuppressWarnings("all")
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
                    System.out.println("定时任务7......");
                },
                triggerContext -> {
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                });
    }
}
复制代码

2.3 数据库方式

/**
 * @desc:
 * @author: YanMingXin
 * @create: 2021/9/28-17:44
 **/
@Configuration
@EnableScheduling
public class SpringScheduleTaskImplByDB implements SchedulingConfigurer {
    @TableName("tb_task")
    @Data
    class MyTask {
        @TableId(type = IdType.AUTO,value = "id")
        private Integer id;
        @TableField(value = "cron")
        private String cron;
    }
    @Mapper
    interface TaskMapper extends BaseMapper<MyTask> {
    }
    @Autowired
    private TaskMapper taskMapper;
    /**
     * 实现自定义任务
     *
     * @param taskRegistrar
     */
    @SuppressWarnings("all")
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
                    System.out.println("定时任务10......");
                },
                triggerContext -> {
                    MyTask myTask = taskMapper.selectById(1);
                    return new CronTrigger(myTask.getCron()).nextExecutionTime(triggerContext);
                });
    }
}
...");
                },
                triggerContext -> {
                    MyTask myTask = taskMapper.selectById(1);
                    return new CronTrigger(myTask.getCron()).nextExecutionTime(triggerContext);
                });
    }
}
复制代码

3 对比

基于注解形式的一般都是静态的定时任务,就是注解中的内容是固定的并且只有一个定时任务,而实现接口的可以是动态的,可以根据配置文件和数据库进行切换。


相关文章
|
1月前
|
druid Java 数据库
Spring Boot的定时任务与异步任务
Spring Boot的定时任务与异步任务
|
1月前
|
Java 数据库 Spring
Spring Boot 实现定时任务的动态增删启停
Spring Boot 实现定时任务的动态增删启停
46 0
|
1月前
|
Java 调度 Maven
Spring Task 自定义定时任务类
Spring Task 自定义定时任务类
45 0
|
1月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
78 0
|
2天前
|
监控 Java BI
Spring Boot中的定时任务调度
Spring Boot中的定时任务调度
|
2天前
|
Java Spring
解密Spring Boot的定时任务
解密Spring Boot的定时任务
4 0
|
2天前
|
监控 Java 调度
Spring Boot中的定时任务调度
Spring Boot中的定时任务调度
|
6天前
|
Java 调度 开发者
Spring Task
Spring Task
9 0
|
1月前
|
Java 调度 开发者
Spring Boot与定时任务:整合与实战
【4月更文挑战第29天】定时任务是现代应用中常见的需求,用于执行周期性的活动,如数据备份、报告生成等。Spring Boot通过集成Spring Task的功能,提供了一种简单有效的方式来调度和执行定时任务。
35 1
|
1月前
|
Java API 调度
定时任务spring task
定时任务是自动化处理任务的关键,常见于电商平台的优惠券发放、银行的还款提醒、财务系统的每日结算和火车票定时放票等场景。实现方式包括多线程结合sleep、JDK的Timer和ScheduledExecutor,以及Quartz和Spring Task等框架。Cron表达式用于设定任务执行的时间规则,由7部分组成,表示秒、分、时、日、月、周和年,并可使用特殊符号如*、?、-、/等来设定更灵活的定时规则。
57 9