定时任务
一、使用背景
定时任务在实际项目开发中很常见,并且定时任务可以在各种场景中应用,通过自动化操作和任务的规模化管理,提高效率、可靠性和工作质量。可以减少手动操作,避免疏忽和错误,并节省时间和人力资源的投入
二、定时任务的优点
- 简单易用:使用注解驱动的方式,简化了定时任务的配置和管理。通过添加@Scheduled注解,可以将普通的方法标记为定时任务,而不需要手动编写定时任务调度的代码。
- 内置任务调度器:Spring Boot内置了一个轻量级的任务调度器,可以方便地执行定时任务。它提供了线程池、任务管理和并发处理等功能,可以高效地管理和执行任务。
- 灵活的配置选项:@Scheduled注解支持各种配置选项,例如cron表达式、fixedRate、fixedDelay等,可以非常灵活地定义任务的触发时间和频率。这使得开发人员能够根据具体需求精确控制定时任务的执行方式
总的来说,Spring Boot定时任务提供了简单、灵活和可扩展的方式来进行任务调度。开发人员可以通过少量的配置和注解来创建定时任务,并利用Spring的特性和生态系统来增强定时任务的功能和性能
三、SpringBoot 实现定时任务
3.0 项目结构
3.1 pom.xml
<!-- web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
3.2 启动类
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.scheduling.annotation.EnableScheduling;// 开启定时任务注解@EnableScheduling@SpringBootApplicationpublicclassScheduledApplication{publicstaticvoidmain(String[] args){SpringApplication.run(ScheduledApplication.class, args);}}
3.3 服务类
importlombok.extern.slf4j.Slf4j;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Service;@Service@Slf4jpublicclass scheduledService {/* 每两秒执行一次 */@Scheduled(cron ="0/2 * * * * ?")publicvoidscheduledTasks(){
log.info("根据cron表达式的定时执行规则,执行任务~");}}
3.4 cron表达式
3.4.1 时间范围
Cron表达式由空格分隔的6个或7个字段组成,每个字段代表一个时间单位。字段的取值范围如下:
参数是否必须范围支持的特殊字符秒(Seconds)是0 ~ 59,- /分(Minutes)是0 ~ 59,- /时(Hours)是0 ~ 23,- /日(DayofMonth)是1 ~ 31,- /? L W月(Month)是1 ~ 12,- /星期(DayofWeek)是1 ~ 7,- /? L #年(Year)否1970 ~ 2099- * /
3.4.2 特殊字符
- (星号):通配符,表示每个时间单位。例如 * * * * ?表示每一秒执行一次。
- ?(问号):该字符用于在日期和星期字段中指定"不指定值"。一般情况下,日期和星期两个字段只能指定一个值,另一个字段要使用问号进行占位。例如0 0 12 ? * MON-FRI表示在每个星期一至星期五的12点执行。
- -(连字符):范围符号,用于指定一个时间单位的取值范围。例如10-30 * * * * ?表示在每分钟的第10秒到第30秒之间执行。
- ,(逗号):枚举符号,用于指定多个时间单位取值的列表。例如1,3,5 * * * * ?表示在每小时的第1分、第3分和第5分执行。
- /(斜杠):间隔符号,用于指定时间单位的间隔。例如0/5 * * * * ?表示每5秒执行一次。
- L(最后的):特殊字符,用于指定某个时间单位的最后一个值。例如0 0 12 L * ?表示在每个月的最后一天的12点执行。
- W(工作日):特殊字符,用于指定距离给定日期最近的工作日(周一至周五)。例如15W * * * ?表示在每个月的第15个工作日当天执行。
- #(井号):特殊字符,用于指定某个月份的第几个星期几。例如0 0 12 ? * 6#3表示在每个月的第三个星期五的12点执行。
3.4.3 cron工具
Cron在线表达式生成器
3.5 启动,测试
四、使用定时任务注意点
避免耗时操作
定时任务的执行应尽量避免执行长时间运行的操作,或者涉及到大量数据处理的任务。因为定时任务是按照预定的时间间隔循环执行的,如果任务执行时间过长,可能会导致任务堆积和性能下降
处理异常情况
在定时任务的执行过程中,难免会遇到一些异常情况。需要确保任务的健壮性,即使出现异常也能够妥善处理,而不会导致整个任务调度系统的崩溃
定时任务的幂等性
在设计定时任务时,需要考虑任务的幂等性,即任务可以重复执行而不会影响最终结果。确保任务的执行逻辑和数据操作是幂等的,以避免数据错误和重复处理的问题。
注意这些要点可以帮助你使用定时任务更加稳定和可靠。根据实际情况,可能还需要考虑其他的因素,如分布式环境下的任务调度、任务依赖关系、任务优先级等
版权归原作者 野生派蒙 所有, 如有侵权,请联系我们删除。