00:00
那接下来我们就来整合SW boot来做一个定时任务,好还是打开我们这个项目,首先在我们这个SW boot里边,想要做定时任务也非常简单,我来创建一个包,我们就叫scheduled来写一个类,我们hello scheduled,我们就在这个类里边来做一个定时任务。那想要在springbot里边做定时任务,首先呢,需要第一个注解叫enable scheduleing,那一听这个开启什么什么功能,那它的作用就是来开启我们这个定时任务,好,我们这个呢,就是来开启定时任务,这是我们的第一步,第二步我们这个东西呢,肯定必须得在容器中,我们来使用component,将它放在容器中,那们想要做定时任务的话,来准备上一个方法,用public white,我们就叫hello方法,那么这个方法呢,就是给控制台打印,Hello,我们使用日志的方式,我们能看到什么时候打印的好,我们来写一个log info。
01:00
我就给控制台来打印,Hello,我们来做一个这个任务,这个任务呢,我们想让它定时执行,我们只需要一个注解叫scheduled,那这个注解呢,一标注以后,在它里边有一个属性叫C,那就是我们说的课文表达式,那这个表达式跟我们括子里边的这个表达式,它基本语法都是一模一样的,只不过稍微有点区别。另外那这个spring boot默认做的这个定时任务,它不是整合course的,如果我们想要整合course,我们只需要引入course子的相关依赖,再来做整合就行了,它呢是使用自己的这个定时任务,当然这个表达式呢都一样好,所以我们来写这个表达式,首先第一个来写一个表达式,先来测一下秒、分时、日、月、周,那日跟周的位置,随便出现一个问号,那现在呢,我们先来测一下我们这个能不能启动,首先呢,我们来放在容器中,那这个功能呢就开启了,然后这就是来开启。
02:00
一个咱们这个定时任务,这是开启一个定时任务,好,我们现在重新来启动我们这个秒化项目,我们来看我们这个定时任务能不能启动起来,好,我们现在来看准备来看我们这个项目的控制台,我把它清空一下,我们来到这儿,好,我发现呢,这个项目启动,然后呢,每秒都会打印一下我们这个,Hello,哎,我们确定是每一秒呢,都会在这个疫秒的刚开始我们就来打印我们这个定时任务,所以呢,我们这个定时任务克隆表达式还是可以的,但这个区别呢,首先第一个我们说在框子里边这个定时任务呢,可以来写七位,第七位呢是一个年,比如我们现在2020年,我来写一个2020,我来写一个第七位,来看有了第七位能不能兼容,我来重启一下,好,那现在呢,看这一块启动报错,他说我们这个schedule的这个注解,它这个注解呢,克隆表达式,它呢必须是由六位的属性组成的,然后呢找到了七个,所以我们说第一。
03:00
个区别就是呢,我们这一块呢,只允许六位在spring中,Spring中咱们这个是六位组成,然后呢,不允许不允许咱们这个第七位的年份,第七位第七位的年,然后说我们这个年呢,就不用写了,然后这是第一个区别,第二个区别还有在我们这个周周这个位置呢,比如我们现在这一块来写一个问号,那就是随便哪一天,我们现在来看一下,我们现在呢是周五,那我想让它周五执行,那按照括里边,首先呢,括里边它说这个一到七,一到七呢代表的是周日到周六,所以呢,周五应该是数字六,因为周六是数字七,所以我们这个想要周五,我们得写一个数字六,那我们写一个数字六,看们这个定时任务能不能做好,我们现在来重新启动起来走好,我们这个项目启动,那现在来等待一下。
04:00
那们希望呢,它每秒都打印一个hello,但是我们发现呢,控制台没有任何打印,所以这个六它呢不代表周五,那在W中周一到周日,那就是一到七,所以我们写五,那就是周五,好,我们现在来重启一下,做一个测试,好我们现在呢启动起来,那发现控制台呢,每秒一个hello,重新就打印了,那么这个五呢,现在就是周五,所以这是我们这一块的区别,你再来披露一下,就是我们这个在咱们这个周的位置,周的位置,周几的位置,主要呢,他想要说这个周几的位置,咱们这个周几的位置呢,我们现在一到七,一到七分别呢,代表咱们这个周一到周日,所以呢,现在是我们这一块的区别,当然我们也可以写Monday到咱们这个Sunday,好,我们来写这个英文标识也是没问题的,那我们一般我们来写一个一到七也行,这我们说到这个问题,那我们现在再来测试一下。
05:00
其他的能不能好用,比如我们在这个秒的位置,我写一个零杠五,那零杠五那就代表在零秒启动,然后呢,每隔五秒执行一次,那这个等零秒我们就不等了,我写一个芯杠五,那就任一秒启动,你呢每五秒给我执行一次,来看一下这个功能能不能起效果好,现在我们的这个系统呢,启动成功,然后呢,它第一个hello的打印来看一下是35秒,然后呢,第二个hello,那就是40秒,然后我们接下来第三个hello,那打印呢,就是45秒,那每五秒一个没问题,所以其他的这个语法呢,都是一模一样的,我们都可以兼容,只是呢,这一块的区别大家注意一下。另外呢,我们再来说一下,在我们这个定时任务里边呢,有一个特别要注意的点,假设我们模拟这个业务超时,我们这个定时任务在每五秒执行一次,我们现在不每五秒了,我们就让它每秒执行一次,然后呢,假设我们这个任务呢时间。
06:00
执行的比较长,那现在呢,让他睡一下thread,点一个sleep,那让他睡一个三秒,那这样我们来模拟任务的时间比较长,那如果按照正常每秒启动一个任务,你时间长,那就你自己去执行吧,我下一秒还有一个任务我要执行的,所以呢,我们理所应当在我们这个生产环境下,你这个定时任务不应该阻塞,我们一般情况下呢,我们这个定时任务不应该阻塞,不应该阻塞,也就是说我们有一个这个定时任务超长了,我们也不应该阻塞其他的这个定时任务的执行,那么现在来看一下,如果我们来三秒以后来重新启动一下这个秒杀项目们,看我们这个定时任务是每秒都一打印呢,那还是要等上一阵。好,我们先来看一下我们的控制台,好,我们等待这个控制台的执行,那现在呢,我们这个启动起来,Hello打印一次,好,我们现在呢,再来看下一个hello,我们发现呢,下一个哈在这,那就等它的下一个hello,我发现这两个hello呢。
07:04
相差了这个四秒的时间,诶这一块呢,还是都是相差了四秒的时间,那虽然让他睡了这个三秒,我们还相差的这个时间挺长,所以我们发现它这一块呢,相当于只要我们当前这个定时任务阻塞住了以后,那呢,下一个定时任务就得不到执行,那这个呢是我们不允许的情况,所以说呢,默认默认是阻塞的,是咱们这个阻塞的,所以在我们这个开发中呢,我们不应该使用这个塞逻辑,那如果我们想要做一个正常的,那我们可以这么来做,那如何让它不成为阻塞的,我们第一种方法,我们以前呢,肯定都是调用什么什么service,所以呢,我们以前的代码肯定都是在这,我们来模拟service超长,那就叉叉叉service,比如我们来调了一个方法叫哈,它呢执行了五秒,那呢,就得等它执行完了再来执行下一个,所以呢,我们第一种情况,我们就可以把我们业务的调用,诶我们。
08:04
来使用异步编排compliable future,这个future呢,我们来run and the anthic,我们让它呢,直接来做一个异步执行,这个异步执行呢,比如我们来写上一个它,然后把我们的业务放到这儿,然后呢,我们把它放到我们业务的线程池里,我们线程池里边的线程数有很多,你每一个过来了以后,比如我们这个XQ,你每一个过来以后呢,我们在线程池里面找一个线程给你执行,你爱执行多少秒,执行多少秒,所以呢,我们现在这个呢,就不阻塞这我们第一种,然后呢,我们可以让业务,可以让咱们这个业务。运行。以咱们这个异步的方式,以异步的方式,然后呢,自己提交到线程池,自己提交提交到咱们这个线程池。这就像我们这种方式,这是我们说的第一种,答,第二种方式呢,本来我们这个spring boot里边呢,它还支持支持我们这个定时任务线程池,定时任务线程池线程池来看一下,如果你使用定时任务的话,那它的这块默认配置,如果我们开启了定时任务功能,那肯定有定时任务的自动配置,定时任务的自动配置呢,叫task,我们叫一个schedule了,来看一下schedule了,我们这个有没有auto configuration之类的,诶我们发现呢,这有一个scheduleing auto configuration,这就是我们这个定时任务的自动配置,在这个自动配置里边呢,它绑定了一些属性,在我们这个task scheduleeduling properties里边,这个属性里边呢,其中就有一个线程池的设置,那末认呢,我们会发现它定时任务的这个池里边其实才有一个线程,所以呢,就解释了为什么这个线程一进来,它呢没有执行完下一个这个定时任务。
09:55
啊,就是启动不起来,所以呢,这就是我们这个原因,好把这个定时任务的设置,我们可以在这儿呢,设置一下CTRLC来复制过来,来到我们这个这儿来支持定时任务线程池来通过设置设置这个,那这个东西呢,它由于是在配置文件里边绑定的,我们看到诶它绑定到配置文件中,所以呢,我们直接来改一个配置文件的配置,我们看行不行,SP,那现在呢,有一个配置叫task scheduled,好,我们就spring task task schedule schedule呢,在下边我们来找它的线程池,池里边的大小呢,这默认是一个来给它调一个五个,那这样的话呢,我们池子里边的数量就有了,那我们现在来重新启动看可不可以走好那么现在呢,这个控制台我们重新来启动起来,来让他打印hello来看一下,好,第一个hello打印发现呢,第二秒它并没有打印,所以它的这一块设置啊,经常会失效,我们这是44秒才开始打。
10:55
打印,因为第一个任务执行以后呢,睡了三秒,第二个任务要在下一秒,所以呢,相当于隔了四秒我们又会做一个打印,所以我们现在呢,就来重新来设置一下,那这个定时任务的线程池,它不太好使。
11:10
所以不一定说spring boot给我们暴露的东西它就能用的,所以我们这个设置这个在有些版本呢,它这一块设置是好使的,但在我们这个版本里边呢,它由于出现了一些bug问题,所以它这个导致呢不好使,但我们可以来使用第三种方式,那第三种方式呢,我们现在就可以让咱们这个定时任务,定时任务一不执行。所以我们直接让它这个hello方法来异步执行,所以我们在spring boot里边,它还有一个东西叫异步任务,When spring boot里边呢,也可以做一个非常快速的异步任务,我们只需要两步,如何让spring boot来做一个异步任务,这是这个定时任务,我们说除了我们自己来写一个线程池,把我们要执行的业务交丢给线程外池外,我们这个boot呢,还支持它的这个异步任务,那这个异制步任务呢,首先第一个我们想要开启异步任功能,那么现在呢,需要一个注解,比如呢,我们叫enable anyic,那这就是我们来开启异步任务,开启我们这个异步任务功能,开启异步任务功能,这是我们都要做到第一步,第二步我们想要让哪个方法异步执行了,我们也不要像以前那么复杂了,还把这个方法整提交给线程池等等等等,那么现在呢,直接可以给这个方法上标一个注解叫A。
12:35
BYNC,那就是anyic,好,我们把这个注解呢拿过来,我们相当于第二个注解给希望咱们这个希望异步执行的,异步执行的方法上,咱们这个标注,标注我们这个注解,那这个注解呢,那就是它它我们在这一标注以后来重新来看一下,那即使没有我们这个线程池的这一块配置来到这儿,好我们把这个驻调,反正配置也不生效,好我们现在来启动一下我们这个项目,来看它是不是每秒都能执行走,好我们现在呢,这个服务启动起来,我发现呢,现在哈,又是呢,每秒都已打印,我们来确认一下,好,30秒,31秒,32秒,每秒都会打印,没问题,所以呢,我们让我们的定时任务以一个异步的方式运行,这呢也就解决了我们这个问题,而且我们说这个异步任务呢,不是说我们要用定时任务的时候才能加异步任务,在我们这个普通的业务逻辑里边,其他的这个业务逻辑里边,那随时想开异步任务都可以。
13:35
哎,直接来开启一个异步任务,我们想要执行的方法,标一个异步任务,我们的a service来调b service标了异步任务的方法,它也是一个异步执行,那这个异步执行呢,它默认也是将任务提交给一个线程池,那包括我们这个异步任务的配置们来看,它这个配置呢,在这叫一个task,有一个叫execution auto confiation,我们的定时任务是task schedule,这个呢是task execution。好,我们把我们这个定时任务的自动配置我们复制过来以后呢,我们这个定时任务的自动配置参考这儿,好,我们这个定时任务三,它的这个自动配置就在这一块,自动配置类它是这个类,而我们这个异步任务的自动配置类呢,它是我们这个类task execution,不是schedule,类是execution了,它是这个的自动配置类,自动来加上自动配置类。
14:32
配置类,而且呢,它默认给器中也会加线程池,我们可以往下看,它呢专门有一个task ex builder,这个builder呢,它可以给我们容器中来添加一个thread铺,Test ex,那这个read铺我们点进来看一下呢,它是一个ex,再来点进来,再来点进来,再来点进来,诶我们发现呢,这就是JC里边的excu,那就相当于我们自己给容器中放了一个线程池,一模一样的东西,所以呢,我们说这个东西呢,我们spring boot也会给它自个儿配一个,而自个儿配的这个东西默认呢,属性也都是在task这个里边来绑定的,好,它的这个属性呢,属性绑定在这个里边,它的这个线程池默认的大小,我们看这个里边,它呢也是规定的,我们这个铺那默认的大小呢是八,所以它的默认大小是八,最大呢是。
15:31
我们这个的这个最大值,相当于我们可以无限填充这么多线程,但是这个肯定我们不能让它这么干,然后呢,包括它的这个队列的大小,队列的大小呢,也是这个最大值这一块的所有东西我们都可以调整,所以我们可以在这来调一个,比如我们这个spring task,那我们现在是异步任务的,那就是excution,我们核心的大小给我们来调一个20,包括呢,我们这个异步任务spring点一个task,它的这个最大大小,以及保持的这个时间,以及它的队列的大小这块呢,全部都可以来调整,那么就来给它调一个最大大小,你最多呢,如创建50,不能让你无限制创建线程啊,我们现在呢,测试期间那就五跟50,那么这么一创建以后呢,也是可以的,这就相当于节省了我们自己给业务中来加线程池的方法,包括如果以后我们自个儿想用这个线程池,想用s spring给我们配的这个线程池,我们直接把这个线程池呢自动注入拿过来。
16:31
哎,一用就行了,这是我们说的这种方式,我们定时任务呢,搭配上异步任务,就最终我们可以实现我们定时任务不阻塞,所以呢,那最终就是解决解决我们使用异步任务,使用咱们这个异步加定时任务,来咱们这个完成定时任务不阻塞的这个功能。
17:00
以后呢,我们就这么来写,那其他的这个表达式的测试,大家就可以在这儿呢,来测一下我们这个定时任务的整合就整合完了,主要呢,就是只要大家简单的会写这个可戎表达式,或者呢在这生成可容表达式,我们就可以来创建一个简单的定时任务。那就可以让他定时执行,那有了这个定时任务,我们下一节课呢,再来编写我们这个秒杀商品的整个上架逻辑。
我来说两句