目录
1.什么是定时任务
定时任务是指在预定的时间点或按照特定的时间间隔自动执行的任务。
定时任务的应用场景:
- 操作系统维护:例如,定期清理临时文件、更新系统补丁等。
- 数据备份:定期对重要数据进行备份,以防数据丢失。
- 自动化测试:例如,在每天凌晨自动运行软件测试脚本。
- 网站维护:比如定时发布新内容、定时发送邮件提醒等。
- 数据分析:例如,定期汇总和分析业务数据,生成报告。
2.Timer的使用
- 在特定时间执行任务,只执行一次
publicvoidschedule(TimerTask task,Date time)
- 在特定时间之后执行任务,只执行一次
publicvoidschedule(TimerTask task,long delay)
- 指定第一次执行的时间,然后按照间隔时间,重复执行
publicvoidschedule(TimerTask task,Date firstTime,long period)
- 在特定延迟之后第一次执行,然后按照间隔时间,重复执行
publicvoidschedule(TimerTask task,long delay,long period)
- 第一次执行之后,特定频率执行,与3同
publicvoidscheduleAtFixedRate(TimerTask task,Date firstTime,long period)
- 在delay毫秒之后第一次执行,后按照特定频率执行
publicvoidscheduleAtFixedRate(TimerTask task,long delay,long period)
参数:
- delay: 延迟执行的毫秒数,即在delay毫秒之后第一次执行
- period:重复执行的时间间隔
示例:
- 配置任务类
//配置任务类publicclassMyTask1extendsTimerTask{@Overridepublicvoidrun(){System.out.println("task1 run");}}
- 启动任务
//启动任务publicstaticvoidmain(String[] args){Timer timer =newTimer();延迟1秒启动,每1秒执行一次
timer.schedule(newMyTask1(),1000,1000);}
3.Spring Task的使用
Spring Task 是 Spring 框架提供的一种轻量级的任务调度解决方案,主要用于在 Java 应用程序中执行定时任务。Spring Task 提供了简单且强大的任务调度功能,适用于各种规模的应用程序。
Api说明
- fixedDelay :上次结束到下次开始执行时间间隔:
@Scheduled(fixedDelay =4000)
- fixedRate:上一次开始执行时间和下次开始时间间隔10s。如:
@Scheduled(fixedRate =10000)
- initialDelay:第一次延迟多长时间后再执行。
@Scheduled(initialDelay=1000, fixedRate=5000)//第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
- Cron表达式
Cron表达式是:由若干数字、空格、符号按一定的规则,组成的一组字符串,从而表达时间的信息。
Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义
Cron 有如下两种语法格式:
- [秒] [分] [小时] [日] [月] [周] [年]
- [秒] [分] [小时] [日] [月] [周]
字段是否必填允许填写的值允许的通配符秒是0-59
, - \* /
分是0-59
, - \* /
小时是0-23
, - \* /
日是1-31
, - \* ? / L W
月是1-12 or JAN-DEC
, - \* /
周是1-7 or SUN-SAT
, - \* ? / L #
年否留空 或 1970-2099
, - \* /
通配符说明:
**
星号(*)
**:表示所有值
~~~~
例如:在分的字段上设置 “*”,表示每一分钟都会触发。
**
减号(-)
**:表示区间
~~~~~~
例如在小时上设置 “10-12”,表示 10,11,12点都会触发。
**
逗号(,)
**:列出枚举
~~~~~~
例如在分钟里,"5,15"表示5分钟和20分钟触发
**
斜杠(/)
**:指定增量
~~~~~~~
例如在分钟里,"3/15”表示从3分钟开始,没隔15分钟执行一次
**
问号(?)
**: 只在日期域和星期域中使用,表示忽略该字段
~~~~
例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
L: 表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示一个星期五
W: 只能用在月份中,表示最接近指定天的工作日
**#**: 只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五
可通过在线生成Cron表达式的工具:https://www.bejson.com/othertools/cron/来生成自己想要的表达式。
常用示例:
表达式含义
0 * * * * ?
每1分钟触发一次
0 0 * * * ?
每天每1小时触发一次
0 0 10 * * ?
每天10点触发一次
0 * 14 * * ?
在每天下午2点到下午2:59期间的每1分钟触发
0 30 9 1 * ?
每月1号上午9点半
0 15 10 15 * ?
每月15日上午10:15触发
*/5 * * * * ?
每隔5秒执行一次
0 */1 * * * ?
每隔1分钟执行一次
0 0 5-15 * * ?
每天5-15点整点触发
0 0/3 * * * ?
每三分钟触发一次
0 0 0 1 * ?
每月1号凌晨执行一次
配置类启用定时任务支持
@EnableSchedulingpublicclassApp{}
配置定时任务
@Component@Slf4jpublicclassScheduledTask{//上一次开始执行时间和下次开始时间间隔5s@Scheduled(fixedRate =5000)publicvoidfixedRateTask(){
log.debug("fixedRateTask");}//上次结束到下次开始执行时间间隔5s@Scheduled(fixedDelay =5000)publicvoidfixedDelayTask(){
log.debug("fixedDelayTask");}//第一次延迟6秒后执行,然后每2s循环执行@Scheduled(initialDelay =6000,fixedDelay =2000)publicvoidinitialDelayTask(){
log.debug("initialDelayTask");}//使用corn表达式每5s执行一次@Scheduled(cron ="0/5 * * * * ?")publicvoidcron(){
log.debug("cronTask执行");}}
多线程(异步)定时任务
- 配置线程池
@ComponentpublicclassExecutorConfig{//定义核心线程数publicstaticfinalintCORE_POOL_SIZE=10;// 最大线程数publicstaticfinalintMAX_POOL_SIZE=20;// 任务队列容量大小publicstaticfinalintQUEUE_MAX_COUNT=100;@Bean("asyncScheduledPool")publicExecutorasyncScheduledPool(){//自定义线程池ThreadPoolTaskExecutor threadPoolExecutor =newThreadPoolTaskExecutor();//设置核心线程数 threadPoolExecutor.setCorePoolSize(CORE_POOL_SIZE);//设置最大线程数 : 长工 + 临时工 threadPoolExecutor.setMaxPoolSize(MAX_POOL_SIZE);//设置任务队列容量大小 threadPoolExecutor.setQueueCapacity(QUEUE_MAX_COUNT);//设置线程的名称前缀 threadPoolExecutor.setThreadNamePrefix("myTask-");//设置拒绝策略 threadPoolExecutor.setRejectedExecutionHandler(newThreadPoolExecutor.AbortPolicy());return threadPoolExecutor;}}
- 开启异步支持:要在 Spring Boot 应用中启用异步方法调用,需在启动类上添加
@EnableAsync
注解。 - 定义异步方法:在服务类中定义一个方法,并使用
@Async
注解标记它以实现异步执行:
版权归原作者 这河里吗l 所有, 如有侵权,请联系我们删除。