00:00
前面的详情页呢,我们已经渲染成功了,在这一块呢,属性信息也都有,并且呢也可以来点击链接切换跳转我们的SQ,那接下来我们就来优化一下我们的整个商品详情的逻辑们在这来商品详情我们在这来查询的时候,那在这呢都是一个顺序查询,一查完了查二查三查四,那我们来以前讲了一个异不编排,那么就可以一个异补的方式来进行查询,但是他们之间呢,又有顺序,一二呢是没关系的,查查谁都行,但345呢,必须依赖一的结果,他才能知道345的信息,所以呢,我们接下来就来写上一不编排,那要用异步编排,我们说在我们以后的系统里边,我们都自己来添加一个线程池,这就是我们的业务线程池,那我们在这个配置里边,我们就来添一个,比如呢,我们就在这里边,我们来填一个MY啊my thread com,我们的线程池的这个配置好,我们来。
01:00
Configuration,那我们以前呢,写过一个线程池,那么就给容器中放一个就行了,我们来public,那线程池呢,叫thread po exe,好,我们来放一个thread po execu,然后呢,我们就来直接拗一个thread po execu,我们就来用自定义创建的方式,然后呢,这几大参数好我们再来回顾一下,我们先来都来写上now,我们来回顾一下这些参数呢都是什么。好,我们都来写上呢,都来写上呢,那现在呢,我们这里边有我们说的七大参数,第一个是核心线程池的大小,那我们说一般我们调一个50就非常美了,来我们也可以,我们系统呢,现在只有100的内存,我们调一个20,最小二十,那最大呢,我们来写一个200,然后呢,空闲线程剩多长时间,我们给它关闭十秒,然后呢,我们时间单位就应该是time unit,好,我们来写成我们的这个秒,那这个秒呢,我们来找到second秒,然后还有我们的这个。
02:06
阻塞队列,阻塞队列的长度呢,我们来限制一下,你有一个link的broken qui,这个长度呢,我们就来限制成10万,相当于呢,我们最多存储10万个异步任务,然后thread factory这个线程工厂,那我们就用它默认的线程工厂所的po excuor默认的这个线程工厂来,我们来找一个thread po executor,那这里没有,那就在exuts里边,Exeuts里边呢,有一个默认的线程工程,我们就使用这个,包括呢这个拒绝策略,那我们就整成我们的这个给他新任务来了,直接来进行抛弃的,好,我们点一个。那么这有一个抛弃的这种策略啊,我们来就来创建一个,它好牛,那这就是我们的线程池的这个配置,这个配置呢,而且我们应该做成可配置的,因为我们的这个线程池的核心大小,以及最大大小,以及我们这个线程等待这些时间,我们都应该作为可配置的,我们最终把这个线程池呢,来创建出去,那如何让它作为可配置的,我先来按它B,那我们就来这么来做假设呢,我们这有一个properties,哎,我们就叫thread thread pull。
03:25
Configig properties configig properties,那thre po的这个属性配置,这个属性配置呢,我们跟配置文件绑定,所以呢,我们上来可以用一个注解叫configuration properties来跟属性文件里边的什么绑定呢?我们可以指定pre好我们的前缀,而且呢,这一块它提示如果我们要用这个属性绑定的话呢,最好可以参照这个文档,这个文档就是我们可以来加一个spring的这个原数据处理器,我们以后写东西呢就有提示了,那把这个我们就可以直接放到我们的依赖里边,不加也是没任何问题的,那我们来加一个好,加一个我们这个属性的最终的提示工具,好我们来到这个proper里边,而且加完以后呢。
04:11
我们要重启一下项目这个才行啊,先把这个不管了,那们现在呢就来绑定我们的这个properties,我们来绑定配置文件中跟我们鼓励mail的thread配置有关的这个配置呢,而且我们把它一定放在容器中,它才能生效,那然后呢,我们就来进行绑定,首先我们来绑定的第一个配置是我们这个应配置的核心线程大小,我们的core,我们的core size,我们核心大小,第二个呢是最大大小private integer的我们的这个最大,我们叫max size,然后呢,第三个是我们这个休眠的这个时长,比如我们都是这个inte,那这个keep alive time,好就叫这些,那我们就整上这三个属性,我们作为可配置的,那我们把它的get set方法加上at一个data,那我们以后呢就可以来配置了,他说,Re,我们重新启动一下,我们这个服务就有配置的提示了,好,我们来重新启动一下。
05:11
那线程池里边的所有东西应该都作为可配置的,我们来到这儿,我们来进行配置,好,那先让它启动,那我们这个服务呢,现在启动成功,那启动成功接下来我们就能有配置了,我们可以在properties里边,我们来编写配置,我们来写一个鼓励ma,诶我们发现呢,有提示course size核心大小,比如我们来给一个20和我们的max size,鼓励ma来我们的mark,比如呢,我们给一个200,还有它的整个keep of alivetime,我们就呢给一个十,那么想要用这些值在我们配置里边用怎么用呢?就来到我们这个thread的配置里边,我们可以直接把它导进来,因为我们说我们的这个配置属性已经加到容器中了,是一个component了,那如果没加的话,我们在我们的配置里边,我们可以使用这个注解叫enable configuration properties,相当于开启我们的这个属性配置,开启谁的属性配置,那们在这可以来指定我们的这个class,好,我们来可以指定这个class。
06:11
相当于开启我们这个properties的配置,我们可以在这来写上,这就相当于我们不写component也行了,好,我们把这个呢除掉,既然写component放在容器中了,那么就可以放心大胆的直接在方法位置直接我们来注入,然后呢,所有的这些大小,好我们就叫铺,所有的这些大小呢,我们都是从配置文件中来获取铺点一个get核心的大小,还有一个铺点一个我们get的咱们这个最大的大小,还有我们这个时间单位,好我们这个铺点一个get我们的keep alive,好,现在呢,我们这一块呢就配置好了,那接下来编写我们的业务,我们使用异步将它编排起来,那我们线程池现在已经有了,我们接下来使用compable future,好,Comp。
07:03
Future,好,我们来进行编排,首先我们来编排,因为我们第一个任务的结果别人还要用,所以呢,我们使用supply ass anthynic run的话呢,只能传一个runable,别人没法用,所以我们使用supply,那这个supply呢,好,我们拿过来,我们现在开启一个异步任务,这个异步任务呢,有返回结果,我们还能指定自己的线程池,但我们自己的线程池呢,我们在容器中,那我们就直接可以自动注入,那以后想要用线程池了,直接thread to excute,好,我们来自动注入我们给容器中配的那个线程池,那然后呢,接下来我们把所有任务都提交给他,提交给这个线程池,这是我们第一个任务,第一个任务要做的就是这一堆,那我们基本信息的提取拿过来,因为别人要用基本信息,所以我return,把这个基本信息呢整完以后,我返回出去,这是我们的第一个异步任务,那我们就叫info。
08:00
这是我们的info future,那么这个info future完了以后呢,他依赖的其他人,我们来看其他人,这三个人呢,都依赖一,所以只要依完了这个英法ex excuse完了,那就应该点then,我们可以来调用then then呢,那就是接下来我们做什么事,接下来呢,因为我们要接收第一个人的结果,所以我们使用的是then accept,然后呢,我们要以异步的方式来运行好then accept,我们来写错了,这不是apply,我们应该是accept,我们然后呢来接收任务,接收任务呢,我们还是放在线程池里边,以异步的方式来进行运行the accept好,然后呢,我们来接收上一步的返回值,比如我们的result,然后呢,我们把返回值拿来,我们来干一件事,然后最终我们来CU,因为我们自己不返回,所以呢,我们在这儿执行我们第二个任务,第二个任务呢,相当于我们来获取这个好SPU销售属性的组合,而这个PU的ID,我们从这个结果里边。
09:00
啊,可以拿到他点一个get po ID没问题,然后呢,接下来再来组合我们下面的任务,这是我们第二个任务,第三个任务还是在第一个完了之后,我不不要给后边再平任,再P任,那相当于这个任务完了再干,那就跟串行化没什么区别,所以呢,我们还是给这个info future里边我们继续来拼装then还是accept,我们来接收我们的这个结果好,然后呢,最终我们来处理一件事情,那就是我们的介绍信息,把它拿过来,好,我们在这来进行处理,那我们的po ID还是从这来获取res.get po ID。来我们是PU ID puid,然后呢,我们这一块呢,就获取完了,然后我们一定要放到我们自己的线程池里边进行执行,然后第三个任务还是他依赖的,还是在第一个完了之后,第三个任务点Z一个accept,然后我们还是拿到第一个的这个结果,我们来进行执行,执行呢,我们把第三个要干的活我们拿过来,就是它好我们来获取规格信息的,好这个规格信息呢,我们还是放在我们的线程池里边进行执行,然后同样的我们的这个po ID以及三级分类ID都是第一个里边有返回它里边get po ID,然后呢,我们再来GET3级分类ID,好res.get我们的三级分类ID,那是catallo这个I,那么都拿到以后呢,第五个任务就做完了,那么我们这三个任务这是并列的。
10:38
但是这三个任务呢,都得等这一个任务完成,然后呢,接下来这个任务跟这个任务呢又没啥关系,所以我们又可以开启一个异步,我使用comp future再来开一个异,第二我们直接可以使用run案S,我们也没有啥返回结果,我们就直接run案S,我们来运行一个异步任务,这个异步任务呢,那就是它,然后我们放在我们的线程池里边来进行运行啊,那就是这个,当然我们所有的异步任务都运行完以后,那最终的这个VO才能返回结果,所以我们应该在这来写一个等待所有任务,所有任务。
11:17
任务都完成,因为每一个任务呢,都是给这个VO里边封装数据的,给我们这个VO里边封装数据,怎么等所有任务都完成,这是一个任务,我们来看一下,好,这是我们的说的图片images,我们的future,然后呢,还有我们的这个info future,这个for future完了以后呢,要执行三个人,三个人呢,一个是我们这个销售属性的,那就叫at trce at tr,我们的这个future。还有一个呢,是我们这个介绍的好,我们把这个介绍的我们也返回过来,那么这个呢,叫介绍describe的future,然后呢,还有我们的这个规格信息的,这就是我们的base,我们的at tr的future。
12:05
那么这三个future我们就可以来进行一步编排,Compliable future,然后呢,我们来等待他们都来做完,所以呢,我们必须写一个o of o of,也就是以上的所有future future in for future future和我们的这个叫cell at future future,包含我们的这个叫describe at tr future future,以及我们的。Best at tr以及我们的image future,那么这几个异步任务都做完了以后。All of就是它们全部做完,他们呢,全部会组合起来,我们只需要调用get方法,那就是等它们全部做完,全部做完以后呢,我们就来返回这个数据,当然这些人如果有什么异常,我们当然也可以调用我们以前的这些什么exception力,如果有异常我们来处理异常,但我们也不用管了,有异常也不用管一步任务有异常就有异常,好,我们来直接来get阻塞,来等结果,最终我们把这个SKU。
13:11
Item VO,我们来进行返回就行了,当然我们这块呢,可以不用写info future,因为这个info future是别人需要关联的,那别人完了他肯定就完了,所以呢,我们可以省略掉这个的写法,好,那这一块呢,有异常,有异常呢,我们就给他抛出去好走。那我们现在呢,就把这个方法改造好了,我们改造成了一个异步模式,然后呢,我们来重新启动。CTRLF9让它重新启动,先保证我们整个页面效果呢是一切正常的,我们再来刷新一下页面,好,这呢提示有一个错误,这个错误就是我们这个声明抛异常的时候,我们的ctrler这一块,那就一定在得声明抛出去,要不查看值,要不抛出去CTRLF9。好,我们重新呢给它进行再一次的编译,那编译完了以后呢,我们就来在这儿来刷新页面测试一下,好,我们来刷新一下页面,先保证我们整个页面效果,诶一切都是运行正常的,那包括我们第一次只要访问通过以后,以后访问都是非常快的,这些点击切换也都是可以正常运行,那这就是我们使用异步编排,将我们整个的商品详情我们可以来编排起来,以后呢,很多业务我们都可以来基于这种思想来做,当然呢,也可以去后台来监控我们整个线程池的工作,那现在呢,有核心20个线程,只要任务执行完了,他们肯定都在那儿等待新任务来,就会直接执行,就不用创建线程,有了线程池和异步编排,最终呢,也能提升我们系统的性能以及吞吐量。
我来说两句