目录
公司最近需要完成一个定时去DB查询数据,把有问题的数据给筛选出来通过微信小程序的消息推送功能将有问题的数据推送给指定的员工去筛查问题。对于Java后端来说肯定实现定时功能肯定是使用到Spring封装好的定时调度Scheduled。
Spring boot启动类代码,加入了@EnableScheduling注解来开启定时器功能
/**
* @author liha
* @version 1.0
* @date 2022/3/15 14:16
*/
@SpringBootApplication
@EnableScheduling // 开启定时功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
调度任务代码,需要通过@Component注解将任务类注入到IoC容器中
/**
* @author liha
* @version 1.0
* @date 2022/3/15 14:23
*/
@Component
public class TestSchedulingTask {
// 这个cron表达式代表从0秒开始,每过3秒执行一次。
@Scheduled(cron = "0/3 * * * * ?")
public void test(){
// 大家可以根据公司的业务来实现,更希望是@Autowrite注入service层的接口,业务逻辑写在service层中。
// 这里测试我就输出当前系统时间了...
Date date = new Date(System.currentTimeMillis());
String rule = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(rule);
String format = simpleDateFormat.format(date);
System.out.println(format);
}
}
这里注意每个任务方法都要加上@Scheduled注解,并且规定好cron表达式。
完全可以放心,不会cron表达式没关系,后面会详细讲解,并且网上也有在线生成cron表达式的网站,我们来看看控制台输出的结果吧。
cron表达式
字段
范围
允许的字符
秒(second)
0-59
,/-*
分(minute)
0-59
,/-*
小时(hour)
0-23
,/-*
日期(day of month)
1-31(需要考虑月份不一致)
,/-*LW
月份(month)
1-12(对应的英文缩写也行)
,/-*
星期(day of week)
1-7
,/-*L
年(year)
这玩意基本用不到
这玩意基本用不到
允许的字符的解释:
,:算是一个枚举,多值的存在,比如second中5,20就代表5和20秒的时候触发。
/:值1/值2,值1代表开始时间,值2代表隔多久一次,比如我案例中就是从0秒开始3秒触发一次。
-:范围值,从多久到多久。
*:全部范围通用。
:只存在于日期和星期中,假如你想要每个月2号触发,但是你星期用*就会每天都会触发,就会产生bug,所以需要?来代替*。
L:表示最后的意思,出现在日期和星期中,比如在日期中使用L就代表当月最后一天,在星期中使用3L就代表最后一个星期三触发。
W:表示工作日,在日期中使用,假如使用9W,如果9号是星期1-5就直接触发,如果9号是星期六就8号触发,如果9号是星期天就星期一触发也就是10号触发。
其实懂个大概就够了,能做笔记记录是最好,因为有在线生成网站,百度随便就能找到
因为本人项目暂时不用考虑异步之类的所以本帖暂时没有带来异步的定时器,不过后续会出异步的帖子,关于定时任务的底层源码也会出篇帖子来细讲。
最后如果本帖对您有帮助,希望点赞+关注,后续一直会更新各种框架的使用和源码解读,您的支持是我最大的动力~!
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦