Hello,大胸弟们,我们又又又见面了,今天攀哥继续为大家分享一下SpringBoot的教程,没点关注的宝宝,点一下关注。
🌲 定时任务简介
🌿 定时任务使用场景
我们在编写SpringBoot应⽤中经常会遇到这样的场景,⽐如:我需要定时地发送⼀些短信、邮件之类 的操作,也可能会定时地检查和监控⼀些标志、参数等。
比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring为我们提供了异步执行任务调度的方式。
定时任务在实际项目开发中很常见,并且定时任务可以在各种场景中应用,通过自动化操作和任务的规模化管理,提高效率、可靠性和工作质量。可以减少手动操作,避免疏忽和错误,并节省时间和人力资源的投入 。
🌿 定时任务的优点
- 简单易用:使用注解驱动的方式,简化了定时任务的配置和管理。通过添加@Scheduled注解,可以将普通的方法标记为定时任务,而不需要手动编写定时任务调度的代码。
- 内置任务调度器:Spring Boot内置了一个轻量级的任务调度器,可以方便地执行定时任务。它提供了线程池、任务管理和并发处理等功能,可以高效地管理和执行任务。
- 灵活的配置选项:@Scheduled注解支持各种配置选项,例如cron表达式、fixedRate、fixedDelay等,可以非常灵活地定义任务的触发时间和频率。这使得开发人员能够根据具体需求精确控制定时任务的执行方式
🌲 定时任务的使用
🌿 简单案例
SpringBoot为我们提供了@EnableScheduling 和 @Scheduled两个注解来实现定时任务,用法比较简单:
- 在启动器上添加注解@EnableScheduling开启定时任务
package com.moxuan.boot_03_async;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class Boot03AsyncApplication {
public static void main(String[] args) {
SpringApplication.run(Boot03AsyncApplication.class, args);
}
}
- 创建一个java类作为定时任务的类,然后再在类中写上任务方法,在方法上加上注解@Scheduled
@Scheduled注解中的属性值:
- fixedRate: 固定频率执行,单位毫秒
- fixedDelay: 延迟执行,单位毫秒
- cron: cron表达式,指定表达式所表示的时间执行
package com.moxuan.boot_03_async.jobs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 定时任务
*
* 第一位,表示秒,取值0-59
* 第二位,表示分,取值0-59
* 第三位,表示小时,取值0-23
* 第四位,日期天/日,取值1-31
* 第五位,日期月份,取值1-12
* 第六位,星期,取值1-7,1表示星期天,2表示星期一
* 第七位,年份,可以留空,取值1970-2099
*
*/
@Component
public class HeartbeatJob {
private static final Logger logger = LoggerFactory.getLogger(HeartbeatJob.class);
/**
* 检查状态1
*/
@Scheduled(cron = "0 35 14 * * ?")
public void checkState1() {
logger.info(">>>>> cron中午14:35上传检查开始....");
logger.info(">>>>> cron中午14:35上传检查完成....");
}
int count =0;
/**
* 检查状态2
*/
// @Scheduled(fixedRate = 3000)
public void checkState2() {
count += 1;
logger.info(">>>>> fixedRate 每隔3秒检查....当前检查第"+count+"次");
}
// @Scheduled(fixed