Java Spring定时任务 亲测

简单代码实例

开启定时任务


package com.test.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@Configuration
public class ScheduleConfig {
}


定时任务触发方法 1

  • 项目启动后每5秒执行的实例

@Component
public class ScheduleController {
    @Scheduled(fixedDelay=5_000)
    public void doInterval() {
        /**
         * 一般考虑到多个独立服务器分布式部署, 此处会加分布式锁
         * */
        try {
            System.out.println("定时处理开始: " + LocalDateTime.now());
        } catch (Exception e) {
            System.out.println("定时处理异常: " + e.getMessage());
        } finally {
            System.out.println("定时处理结束: " + LocalDateTime.now());
        }
    }

}

Spring定时任务有两种配置方式 注解方式, Xml方式

本文讲解 @Scheduled的几个常用参数

  1. cron:一个类似linux crontab的表达式, 有7个元素组成(年元素可以省略, 省略了默认是每一年)
  2. zone:cron表达式的时区
  3. fixedDelay:在上一次调用结束和下一次调用开始之间以固定周期(单位为毫秒). 等待上次任务完成后
  4. fixedRate:在调用之间以固定的周期(单位为毫秒). 不等待上次任务完成
  5. initialDelay:第一次执行 fixedRate, fixedDelay任务之前延迟的毫秒数
  • 注意事项
    @Scheduled只能用于无参方法上
    cron, fixedDelay, fixedRate中只能同时存在一个, cron可以定义复杂任务, fixedDelay和 fixedRate只能定义简单任务

cron元素说明:

序号说明必填允许填写的值允许的特殊字符
10~59,*-/
20~59,*-/
3小时0~23,*-/
40~31,-*?/LWC
51-12,*-/
61-7 or SUN/MON/TUE/WED/THU/FRI/SAT 例 SUN = 1,-*?/LC#
71970-2099,*-/

通配符说明:

  • “*” 表示所有值, 表示每一分钟都会触发
  • “?” 表示不指定值, 使用的场景为不需要关心当前字段. 例: 要每月的10号触发, 不关心是周几 0 0 0 10 * ?
  • “-” 表示区间, 例: "10-12"表示 10,11,12
  • “,” 表示指定多个值, 例: 周字段设置 "MON,WED,FRI"表示周一,周三和周五触发
  • “/” 用于递增触发, 例: 秒字段设置 "5/15"表示从5秒开始每增15秒触发(5,20,35,50), 月字段设置 "1/3"表示每月1号开始每隔三天触发一次
  • “L” 表示最后,
    1. 日字段设置表示当月的最后一天.
    2. 周字段表示星期六 “7”, “SAT”.
    3. "L"前加上数字则表示该数据的最后一个, 例: 周字段设置 "6L"表示本月最后一个星期五.
  • “W” 表示离指定日期的最近那个工作日(周一至周五). 例: 日字段设置 “15W”, 表示离每月15号最近的那个工作日触发. 如果15号正好是周六则找最近的周五(14号)触发, 如果15号是周未则找最近的下周一(16号)触发. 如果15号正好在工作日(周一至周五)则就在该天触发. 如果设置 "1W"则表示每月1号往后最近的工作日触发. 如果1号正是周六则将在3号下周一触发 (注 "W"前只允许设置具体的数字, 不允许区间 “-”).
  • “#” 序号(表示每月的第几个周几), 例: 周字段设置 "6#3"表示在每月的第三个周六. 注 如果指定 "#5"正好第五周没有周六则不会触发. 'L’和 'W’可以一组合使用, 如果在日字段上设置 "LW"则表示在本月的最后一个工作日触发, 周字段的设置若使用英文字母是不区分大小写的即 MON与 mon相同.
cron常用案例

*/1 * * * * ?		每隔1秒执行一次
0 */1 * * * ?		每隔1分钟执行一次
0 0 14 * * ?		每天14点执行一次
0 0 6 ? * L		每周星期天凌晨6点执行一次
0 0 6 1 * ?		每月1号凌晨6点执行一次
0 0 20 L * ?		每月最后一天20点执行一次
0 0,2,9,16 * * * ?	0分,2分,9分,16分执行一次
0 0 0,23 * * ?		每天的0点,23点都执行一次
0 0/5 9-18 * * ?	朝9晚6时间内每5分钟执行
0 0 12 ? * WED		每个周三中午12点执行
0 15 10 ? * *		每天上午10:15执行(必须日或周中有一个设置为"?")
0 15 10 * * ?		每天上午10:15执行(必须日或周中有一个设置为"?")
0 15 10 * * ? *		每天上午10:15执行(必须日或周中有一个设置为"?")
0 15 10 * * ? 2019	2019年的每天上午10:15执行
0 * 14 * * ?		每天下午2点到下午2:59期间的每1分钟执行
0 0/5 14 * * ?		每天下午2点到下午2:55期间的每5分钟执行
0 0/5 14,18 * * ?	每天下午2点到2:55期间和下午6点到6:55期间的每5分钟执行
0 0-5 14 * * ?		每天下午2点到下午2:05期间的每1分钟执行
0 10,44 14 ? 3 WED	每年三月的周三的下午2:10和2:44执行
0 15 10 ? * MON-WED	周一至周三的上午10:15执行
0 15 10 12 * ?		每月12日上午10:15执行
0 15 10 L * ?		每月最后一日的上午10:15执行
0 15 10 ? * 6L		每月的最后一个周五上午10:15执行
0 15 10 ? * 6L 2018-2019	2018年至2019年的每月的最后一个周五上午10:15执行
0 15 10 ? * 6#3		每月的第三个周五上午10:15执行

定时任务触发方法 2

  • 项目启动后每分钟00秒执行的实例

@Component
public class ScheduleController {
    @Scheduled(cron="0 0/1 * * * ?")
    public void doInterval() {
        /**
         * 一般考虑到多个独立服务器分布式部署, 此处会加分布式锁
         * */
        try {
            System.out.println("定时处理开始: " + LocalDateTime.now());
        } catch (Exception e) {
            System.out.println("定时处理异常: " + e.getMessage());
        } finally {
            System.out.println("定时处理结束: " + LocalDateTime.now());
        }
    }

}

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值