Spingboot的定时器

来源:互联网 发布:软件著作权申请表打印 编辑:程序博客网 时间:2024/06/16 21:12

1.场景还原

     定时器在我们项目实际需求中经常会遇到,有的同学可能会头疼,复杂的触发定时条件撸的我们身心俱疲,今天博主就springboot自带的定时器给大家引个道

2.实现方案

①在启动类中配置@EnableScheduling

@SpringBootApplication@MapperScan(basePackages = "com.cckj.dao", markerInterface =Mapper.class)@EnableSchedulingpublic class Application extends SpringBootServletInitializer {    private static Logger logger = LoggerFactory.getLogger(Application.class);    @Override    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {        return builder.sources(Application.class);    }    public static void main(String[] args) {        SpringApplication.run(Application.class, args);        logger.info("My Spring Boot Application Started");    }}
这样工程就允许支持定时器了;剩下的就是触发定时任务的事儿了

②自定义定时任务类

@Componentpublic class Scheduler {    private final Logger logger = LoggerFactory.getLogger(this.getClass());    @Autowired    UserService userService;    @Scheduled(cron="0 0/1 * * * ?") //每分钟执行一次    public void statusCheck() {        LocalDateTime localDateTime = LocalDateTime.now();        logger.info("每分钟执行一次。开始……:"+ localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));        LocalDateTime localDateTime1 = LocalDateTime.now();        //statusTask.healthCheck();        logger.info("每分钟执行一次。结束:"+localDateTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));    }    @Scheduled(fixedRate=20000)    public void testTasks() {        List<User> userList = userService.getUser();        for (User u : userList){            logger.info(u.getName()+","+u.getPassword());        }    }}
申明一个定时任务

 @Scheduled
然后其中的条件是何时触发定时任务的条件;

其中

 @Scheduled(fixedRate=20000)
表示每隔20秒执行一次定时任务;

@Scheduled(fixedDelay=20000)
表示定时任务完成后延迟20秒再次执行;

3.cron表达式说明

最重要的boss上场了

@Scheduled(cron="0 0/1 * * * ?") //每分钟执行一次
接下来普及下cron表达式,只要记住几个常用的就行了

cron表达式一般只有7位 

 第一位,表示秒,取值0-59* 第二位,表示分,取值0-59* 第三位,表示小时,取值0-23* 第四位,日期天/日,取值1-31* 第五位,日期月份,取值1-12* 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思          另外:1表示星期天,2表示星期一。* 第7为,年份,可以留空,取值1970-2099
cron还有些特殊的字符

(*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...(?)问号:问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天3点执行,所以第六位星期的位置,我们是不需要关注的,就是不确定的值。同时:日期和星期是两个相互排斥的元素,通过问号来表明不指定值。比如,110日,比如是星期1,如果在星期的位置是另指定星期二,就前后冲突矛盾了。(-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从1012点,即10,11,12(,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四(/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是015304560    另:*/y,等同于0/y
举栗子

0 0 3 * * ?     每天3点执行0 5 3 * * ?     每天35分执行0 5 3 ? * *     每天35分执行,与上面作用相同0 5/10 3 * * ?  每天3点的 5分,15分,25分,35分,45分,55分这几个时间点执行0 10 3 ? * 1    每周星期天,310分 执行,注:1表示星期天    0 10 3 ? * 1#3  每个月的第三个星期,星期天 执行,#号只能出现在星期的位置
根据自己的实际需求,各位同学选择相应的cron表达式把!可能有的同学还在疑惑,为什么我自己不能把开启定时器的控制权牢牢掌握在自己手里呢?为什么非要在启动类里面配置呢?

笔者答案:方便,无需自己控制,也可满足实际的项目需求;启动类里面的配置无非就是允许工程支持定时器而已,并不是开启定时器;别想多了,他没想着跟你争权哦;

好了,我是张星;欢迎加入博主技术交流群,群号:313145288


原创粉丝点击