java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Schedule用法

Java定时任务Schedule的基本用法及Cron表达式实践记录

作者:三金12138

本文介绍了Spring框架提供的@Scheduled注解和cron表达式在Java定时任务中的应用,详细讲解了基础配置、Cron表达式解析以及进阶用法和注意事项,感兴趣的朋友跟随小编一起看看吧

在日常Java开发中,定时任务是高频需求场景,比如定时同步数据、定时清理日志、定时发送通知等。Spring框架提供的@Scheduled注解简化了定时任务的开发,无需依赖外部调度框架(如Quartz),就能快速实现轻量级定时任务。而cron表达式作为Schedule中灵活度最高的触发规则配置方式,是掌握该功能的核心。本文将从Schedule的基础用法入手,深入解析cron表达式,并结合实例演示其在项目中的应用。

一、Spring Schedule基础配置

要使用Spring Schedule,首先需要完成基础配置,整体步骤简单易懂,适用于Spring Boot项目和传统Spring项目。

1.1 依赖引入(Spring Boot)

Spring Boot项目无需额外引入依赖,spring-boot-starter中已包含Schedule相关组件,只需确保pom.xml(Maven)中存在核心依赖:

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

1.2 开启定时任务支持

在Spring Boot启动类上添加@EnableScheduling注解,开启定时任务调度功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 开启定时任务
public class ScheduleDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduleDemoApplication.class, args);
    }
}

1.3 基础定时任务实现

通过@Scheduled注解标记方法为定时任务,支持多种触发规则,常见的有固定延迟、固定频率和cron表达式三种方式。其中cron表达式适用于复杂的时间规则配置,也是本文重点。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component // 交给Spring管理
public class ScheduleTask {
    // 固定延迟:上一次任务执行完毕后延迟1秒执行下一次
    @Scheduled(fixedDelay = 1000)
    public void fixedDelayTask() {
        System.out.println("固定延迟任务执行:" + System.currentTimeMillis());
    }
    // 固定频率:每隔1秒执行一次(无论上一次是否完成)
    @Scheduled(fixedRate = 1000)
    public void fixedRateTask() {
        System.out.println("固定频率任务执行:" + System.currentTimeMillis());
    }
    // cron表达式:每天凌晨2点执行
    @Scheduled(cron = "0 0 2 * * ?")
    public void cronTask() {
        System.out.println("Cron任务执行:" + System.currentTimeMillis());
    }
}

二、Cron表达式深度解析

Cron表达式是一种时间表达式,用于定义复杂的定时规则,起源于Unix系统,后被广泛应用于各类调度框架。在Spring Schedule中,cron表达式支持6个或7个字段,字段之间用空格分隔,语法格式如下:

2.1 表达式格式

Spring Schedule中的cron表达式格式(7个字段,最后一个年份字段可选):

秒 分 时 日 月 周 年(可选

各字段的取值范围及允许的特殊字符如下表所示:

字段

取值范围

允许的特殊字符

说明

0-59

, - * /

每秒用*表示,每5秒用0/5表示

0-59

, - * /

每分用*表示,每10分用0/10表示

0-23

, - * /

每天凌晨2点用2表示,每6小时用0/6表示

1-31

, - * / ? L W C

?表示不指定值,避免日和周冲突;L表示当月最后一天

1-12 或 JAN-DEC

, - * /

1表示1月,JAN也可表示1月

1-7 或 SUN-SAT

, - * / ? L C #

1表示周日,7表示周六;#表示第几个周几,如6#3表示当月第3个周五

年(可选)

1970-2099

, - * /

省略时表示所有年份

2.2 特殊字符含义

cron表达式的灵活度依赖于特殊字符的使用,核心特殊字符的含义如下:

2.3 常用Cron表达式示例

结合实际业务场景,整理以下常用cron表达式,可直接套用:

三、Schedule进阶用法与注意事项

3.1 异步定时任务

默认情况下,Spring Schedule的定时任务是同步执行的,即多个任务会在同一个线程中按顺序执行,若某个任务执行时间过长,会阻塞其他任务。如需异步执行,可通过@EnableAsync@Async注解实现:

// 1. 启动类添加@EnableAsync开启异步支持
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ScheduleDemoApplication { ... }
// 2. 定时任务方法添加@Async注解
@Component
public class ScheduleTask {
    @Async
    @Scheduled(cron = "0/5 * * * * ?")
    public void asyncCronTask() {
        System.out.println("异步Cron任务执行:" + Thread.currentThread().getName());
    }
}

3.2 动态调整Cron表达式

静态cron表达式在项目启动后无法修改,若需动态调整触发规则,可通过实现SchedulingConfigurer接口自定义调度配置,从数据库或配置中心读取cron表达式:

import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
@Component
public class DynamicCronTask implements SchedulingConfigurer {
    // 模拟从数据库获取cron表达式(实际项目中可对接DB或Nacos)
    private String cron = "0/5 * * * * ?";
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 注册定时任务
        taskRegistrar.addTriggerTask(
                this::dynamicTaskExecute, // 任务执行逻辑
                triggerContext -> {
                    // 每次触发前重新获取cron表达式(实现动态更新)
                    CronTrigger trigger = new CronTrigger(getCron());
                    return trigger.nextExecutionTime(triggerContext);
                }
        );
    }
    public void dynamicTaskExecute() {
        System.out.println("动态Cron任务执行:" + System.currentTimeMillis());
    }
    // 获取最新cron表达式(可扩展为从数据库查询)
    public String getCron() {
        return this.cron;
    }
    // 更新cron表达式
    public void setCron(String cron) {
        this.cron = cron;
    }
}

3.3 核心注意事项

到此这篇关于Java定时任务Schedule的基本用法及Cron表达式实践的文章就介绍到这了,更多相关Java Schedule用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文