SpringBoot---scheduling定时任务的使用总结

一、前言

在介绍一个技术名词的时候,我的思路是如下的。

1. 知道名词概念

2. 具有什么功能

3. 具体的使用步骤

4. 核心的组件

5. 技术的基本执行流程

6. 技术需要注意的坑

7. 技术和其他的优秀的同类型框架的对比

二、定时任务的介绍

定时任务相当与我们生活中的闹钟,可以满足周期性执行任务的需求。

三、scheduling具有什么功能

1. 可以按周期进行执行,如每天3点执行一次啊 ,符合cron表达式

2. 可以按fixedDelay延迟执行,每隔几秒执行一次

3. 可以按fixedRate执行,没有延迟,直接每隔几秒执行一次

2和3是具有细微的区别的

scheduling也是一个单现线程处理的程序。

四、具体的使用步骤

SpringBoot中的核心具有集成了Scheduled功能,step1.在@SpringBootApplication中基础上写@EnableScheduling 开启定时任务

step2.在具体的组件的方法需要使用 @scheduled(cron="") |@scheduled(fixedDelay="")|@scheduled(fixedRate="")放置在方法注解上

@SpringBootApplication
@EnableScheduling
public class CrudApplication {
}

@Component
public class PrintTask {
@Scheduled(cron = "*/20 * * * * *")//20秒执行一次
public void print() throws InterruptedException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(new Date())+",发送一个定时任务");
Thread.sleep(10000);
}
}

需要去了解Cron表达式

五、基本执行流程

springBoot中启动的使用SpringootApplication.run会生成spring对象,然后会去加载环境上下文也就是容器,在容器解析中的过程中执行后置处理器PostProcessor 

在这个方法中会去获得bean中是否具有方法是被@scheduled进行注解的,如果是则把这个方法作为一个task放置到register列表中,然后Spring生成一个RegisterBean,该Bean就是会去执行register列表中的任务。

根据xx时间,然后进行堵塞,然后先执行cron的任务,执行完再执行其他的任务,使用了juc中的技术。

六、技术需要注意的坑

该处理任务是单线程的,也就是说如果一个任务执行时间过长,那么其他的任务当时间了也不能就行执行,只有上一个任务进行执行完成之后才能执行,这样的时候有时候就不能达到我们想要的效果了。

解决方法,使用多线程进行异步处理。

七、技术和其他的优秀的同类型框架的对比

具有Quartz这个任务调度框架可以代替sheduling,quartz具有二大特点的功能

  • 持久性作业 - 就是保持调度定时的状态;
  • 作业管理 - 对调度作业进行有效的管理;

同时,支持多线程。

posted @ 2019-11-27 14:17  逆水不进则退  阅读(1729)  评论(0)    收藏  举报