提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Spring Task之定时任务
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
在软件开发中,定时任务是非常常见的需求。它们允许我们在预定的时间或间隔内自动执行某些特定的操作,如数据备份、文件清理、报表生成等。而 Spring Task 就是 Spring 框架提供的一个强大工具,用于简化定时任务的开发和管理。
通过 Spring Task,我们可以轻松地定义、配置和执行定时任务,无需关心复杂的线程管理和调度细节。它提供了灵活的任务执行机制,可以根据需求设置任务的执行时间、频率以及执行的逻辑。
在这篇博客中,我将深入探讨 Spring Task 之定时任务的相关概念和特性。我们将了解如何使用 Spring Task 来创建定时任务、配置任务执行的时间和频率,以及如何处理任务执行过程中的异常情况。
无论你是 Spring 框架的新手还是有经验的开发者,我相信这篇博客都将为你提供有价值的信息和实用的技巧。让我们一起探索 Spring Task 的世界,掌握定时任务的开发技能,为我们的项目增添自动化的魅力!
准备好开始了吗?让我们一起踏上这段定时任务的探索之旅吧!
提示:以下是本篇文章正文内容,下面案例可供参考
Spring Task是Spring框架提供的一种任务调度和异步处理的解决方案。它可以帮助开发者在Spring应用中轻松地实现定时任务、异步任务等功能,提高应用的效率和可维护性。
Spring Task的主要特点包括:简单易用、内置支持、灵活的任务调度、异步任务支持以及集成注解和监控管理。它提供了简洁的注解和配置方式,使得任务调度和异步处理变得容易上手。同时,Spring Task还支持基于cron表达式的定时任务调度,能够满足各种复杂的调度需求。
Spring Task依靠Cron表达式配置定时规则。Cron表达式是一个字符串,分为6或7个域,每一个域代表一个含义,以空格隔开。有如下两种语法格式:
每一个域可出现的字符如下:
Seconds(秒):可以出现", - * /"四个字符,有效范围为0-59的整数。
Minutes(分):域中可出现, - * /四个字符,以及0-59的整数
Hours(时):域中可出现, - * /四个字符,以及0-23的整数
DayofMonth(日期):域中可出现, - * / ? L W C八个字符,以及1-31的整数
Month(月份):域中可出现, - * /四个字符,以及1-12的整数或JAN-DEC的单词缩写
DayofWeek(星期):可出现, - * / ? L # C八个字符,以及1-7的整数或SUN-SAT 单词缩写,1代表星期天,7代表星期六
Year(年份):域中可出现, - * /四个字符,以及1970~2099的整数。该域可以省略,表示每年都触发。
含义 | 表达式 |
---|---|
每隔5分钟触发一次 | 0 0/5 * * * * |
每小时触发一次 | 0 0 * * * * |
每天的7点30分触发 | 0 30 7 * * * |
周一到周五的早上6点30分触发 | 0 30 7 ? * 2-6 |
每月最后一天早上10点触发 | 0 0 10 L * ? |
每月最后一个工作日的18点30分触发 | 0 30 18 LW * ? |
2030年8月每个星期六和星期日早上10点触发 | 0 0 10 ? 8 1,7 2030 |
每天10点、12点、14点触发 | 0 0 10,12,14 * * * |
朝九晚五工作时间内每半小时触发一次 | 0 0 0/30 9-17 ? * 2-6 |
每周三中午12点触发一次 | 0 0 12 ? * 4 |
每天12点触发一次 | 0 0 12 * * * |
每天14点到14:59每分钟触发一次 | 0 * 14 * * * |
每天14点到14:59每5分钟触发一次 | 0 0/5 14 * * * |
每天14点到14:05每分钟触发一次 | 0 0-5 14 * * * |
每月15日上午10:15触发 | 0 15 10 15 * ? |
每月最后一天的上午10:15触发 | 0 15 10 L * ? |
每月的第三个星期五上午10:15触发 | 0 15 10 ? * 6#3 |
1.创建SpringBoot项目,在启动类开启定时任务。
@SpringBootApplication
@EnableScheduling
public class Springbootdemo8Application {
public static void main(String[] args) {
SpringApplication.run(Springbootdemo8Application.class, args);
}
}
2.编写定时任务类
@Component
public class MyTask {
// 定时任务方法,每秒执行一次
@Scheduled(cron="* * * * * *")
public void task1() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println(sdf.format(new Date()));
}
}
@Scheduled写在方法上方,指定该方法定时执行。常用参数如下:
// 立即执行,任务结束后每5秒执行一次
@Scheduled(fixedDelay=5000)
public void task1() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(sdf.format(new Date()));
}
// 立即执行,之后每5秒执行一次
@Scheduled(fixedRate=5000)
public void task2() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(sdf.format(new Date()));
}
// 项目启动3秒后执行,之后每5秒执行一次。
@Scheduled(fixedRate=5000,initialDelay = 3000)
public void task3() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(sdf.format(new Date()));
}
Spring Task定时器默认是单线程的,如果项目中使用多个定时器,使用一个线程会造成效率低下。此时我们可以给Spring Task配置线程池。
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 创建线程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
提示:这里对文章进行总结:
通过学习和使用 Spring Task,我们可以方便地实现定时任务,提高应用的自动化程度和效率。希望这篇博客对你有所帮助,让你在定时任务的开发中更加得心应手!如果你有任何问题或建议,欢迎留言讨论。