Spring Boot 实现定时任务的案例

以下是一个使用 Spring Boot 实现定时任务的案例,涵盖了定时任务的基本配置和实现。

案例:定时发送邮件提醒

  1. 添加依赖

在 pom.xml 中添加 Spring Boot 的依赖,以及邮件发送的相关依赖:

XML 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
</dependencies>
  1. 配置定时任务

在 Spring Boot 的主类上启用定时任务:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling // 启用定时任务
public class ScheduledTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduledTaskApplication.class, args);
    }
}
  1. 创建定时任务类

创建一个定时任务类,定义定时任务的方法:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class EmailReminderTask {

    @Autowired
    private JavaMailSender mailSender;

    // 定义定时任务,每天早上 9 点执行
    @Scheduled(cron = "0 0 9 * * ?")
    public void sendDailyReminder() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("sender@example.com");
        message.setTo("recipient@example.com");
        message.setSubject("每日提醒");
        message.setText("这是您的每日提醒邮件,今天是 " + new Date());
        
        mailSender.send(message);
        System.out.println("每日提醒邮件已发送!");
    }
}
  1. 配置邮件属性

在 application.properties 文件中配置邮件发送的相关属性:

bash 复制代码
spring.mail.host=smtp.example.com
spring.mail.port=587
spring.mail.username=sender@example.com
spring.mail.password=your-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
  1. 测试运行

启动 Spring Boot 应用程序,定时任务会自动开始运行。每天早上 9 点,系统会自动发送一封提醒邮件。

扩展案例:动态调整定时任务

如果需要动态调整定时任务的执行时间,可以通过以下方式实现:

  1. 创建配置类

创建一个配置类,用于存储定时任务的配置信息:

java 复制代码
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "task.schedule")
public class TaskScheduleConfig {
    private String cronExpression;

    public String getCronExpression() {
        return cronExpression;
    }

    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }
}
  1. 修改定时任务类

在定时任务类中注入配置类,并使用 @Scheduled 注解的 cron 属性动态设置执行时间:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class DynamicTask {

    @Autowired
    private TaskScheduleConfig taskScheduleConfig;

    // 动态设置定时任务的执行时间
    @Scheduled(cron = "#{taskScheduleConfig.cronExpression}")
    public void executeTask() {
        System.out.println("动态定时任务执行中...");
        // 任务逻辑
    }
}
  1. 配置属性文件

在 application.properties 文件中添加定时任务的配置:

bash 复制代码
task.schedule.cronExpression=0 0/5 * * * ?

以上配置表示每 5 分钟执行一次任务。

注意事项

  1. 任务线程池:默认情况下,Spring Boot 的定时任务使用单线程顺序执行。如果需要并发执行多个任务,可以配置任务线程池。

  2. 任务监控:可以结合 Spring Boot Actuator 对定时任务进行监控和管理。

  3. 任务异常处理:在任务中添加异常处理逻辑,避免任务因异常而停止执行。

  4. 任务日志:记录任务的执行日志,方便后续的排查和分析。

通过以上案例,你可以快速实现 Spring Boot 中的定时任务功能,并根据实际需求进行扩展和优化。

相关推荐
步行cgn6 小时前
YAML 的语法规则
spring boot·后端
骇客野人6 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
摇滚侠6 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
wxwx_bscxy3227 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
IT_陈寒9 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端
码事漫谈10 小时前
一天搭出 80% 的 Agent,然后卡在 95% 到死
后端
leonkay10 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
江湖十年10 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
八角丶10 小时前
Node 网络编程 —— TLS 模块
javascript·后端·node.js
摇滚侠11 小时前
《SpringBoot 3:入门与应用实战》第 9 章 跨域问题 阅读笔记 27
spring boot·笔记·okhttp