Java定时任务的实现 @Scheduled方案

使用Scheduled的方式实现定时任务

本意:想凌晨1点定时执行服务层的某个方法,那么如果在非Service/非Controller层成功注入Service层,需要将注入的对象交由静态对象管理。

注入完成后按需改变@Scheduled后面域即可实现定时任务

import com.scau.amops.service.IAmopsAgrimacRunrecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class TimingTask {

    @Autowired
    IAmopsAgrimacRunrecordService amopsAgrimacRunrecordServiceAuto;  //注入对象

    private static IAmopsAgrimacRunrecordService amopsAgrimacRunrecordService;  //静态对象

    @PostConstruct
    public void init(){
        amopsAgrimacRunrecordService = this.amopsAgrimacRunrecordServiceAuto;  //注入的对象由静态对象管理
    }

    //每天凌晨1点定时执行该任务
    @Scheduled(cron = "0 0 1 * * ?")
    public void timingExecuteCalculateRunRecordToSecond() {
        amopsAgrimacRunrecordService.calculateAmopsAgrimacRunrecordToSecond();
    }
}

@Scheduled(cron = "0 0 1 * * *")中的域如何更改?

cron表达式中可以有6个或7个域,年不是必须的域,可以省略年,则一共6个域

@Scheduled(cron = "秒 分 时 日 月 周 年")

域范围

范围可使用的通配符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * ? / L W
1-12 / JAN-DEC, - * /
1-7 or SUN-SAT, - * ? / L #
1970-2099, - * /

通配符说明:

  • , 表示指定多个值,比如周设置为 MON,FRI,表示周一周五触发
  • - 表示区间,设置小时为15-17,表示 15,16,17点都会触发
  • * 表示所有值,设置日为*,表示每天都会触发
  • / 用于递增触发,设置日为1/5,表示所示每月1号开始,每隔5天触发一次
  • ? 表示不指定值,使用的场景为不需要关心当前设置这个字段的值
  • L 表示最后的意思,只可用在日和周,设置日为L,表示当月的最后一日,周字段上设置6L这样的格式,则表示本月最后一个星期五
  • W 表示离指定日期的最近那个工作日(周一至周五),设置日为10W,表示离每月10号最近的那个工作日触发
  • # 序号(表示每月的第几个周几),设置周为1#2表示在每月的第2个周一
    注:LW可以一组合使用。如果在日字段上设置LW,则表示在本月的最后一个工作日触发

一些小示例供参考:

  • 每隔10秒触发一次:"*/10 * * * * ?"
  • 每隔10分钟触发一次:"0 */10 * * * ?"
  • 每天凌晨1点触发一次:"0 0 1 * * ?"
  • 每月5号凌晨1点触发一次:"0 0 1 5 * ?"
  • 每月最后一天22点触发一次:"0 0 22 L * ?"
  • 每周日凌晨1点触发一次:"0 0 1 ? * L"
  • 在20分、40分、59分都触发一次:"0 20,40,59 * * * ?"
  • 每天的8点、12点、18点、22点都触发一次:"0 0 8,12,18,22 * * ?"
  • 表示在每月的1日的凌晨2点触发一次:"0 0 2 1 * ? *"
  • 表示周一到周五每天上午8:30触发一次:"0 30 8 ? * MON-FRI"/"0 30 8 ? * 1-5"
  • 表示2020-2030年的每个月的最后一个星期五上午10:00触发一次:"0 0 10 ? * 6L 2020-2030"

欢迎小伙伴讨论,如有错误请在评论区评论或发私聊消息,谢谢你。


版权声明:本文为bean_business原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。