基于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表示这个月的最后一个星期五

image.png

示例

/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);
                });
    }
    
}

3 对比

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

相关文章
|
7月前
|
Java 数据库 Spring
Spring Boot 实现定时任务的动态增删启停
Spring Boot 实现定时任务的动态增删启停
102 0
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
144 1
|
2月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
166 1
|
2月前
|
存储 Java API
简单两步,Spring Boot 写死的定时任务也能动态设置:技术干货分享
【10月更文挑战第4天】在Spring Boot开发中,定时任务通常通过@Scheduled注解来实现,这种方式简单直接,但存在一个显著的限制:任务的执行时间或频率在编译时就已经确定,无法在运行时动态调整。然而,在实际工作中,我们往往需要根据业务需求或外部条件的变化来动态调整定时任务的执行计划。本文将分享一个简单两步的解决方案,让你的Spring Boot应用中的定时任务也能动态设置,从而满足更灵活的业务需求。
183 4
|
5月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
15061 33
|
7月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
149 0
|
4月前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
60 0
|
4月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
79 0
|
5月前
|
SQL Java 调度
实时计算 Flink版产品使用问题之使用Spring Boot启动Flink处理任务时,使用Spring Boot的@Scheduled注解进行定时任务调度,出现内存占用过高,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
XML Java Linux
Spring Task 定时任务没有定时执行是为什么?
Spring Task 定时任务没有定时执行是为什么?
82 2