00:00
好,前面呢,我们说了一下select3.0里边的异步处理,那么基于3.0异步处理机制来说一下MVC里边的整个异步处理,那么MVC的异步处理我们完全可以参照MVC的这个官方文档,这一块呢,有一个叫anthic request点进来,那么这个spring m VC呢,也是基于咱们这个三来做的异步处理。当然那么MVC的封装就更简单了,我们即使不知道里边的这些API,我们也可以来使用,那怎么用呢?这就有一些例子,比如我们第一种方法的返回值写成able,或者呢,第二种写成一个叫dier,哎,这两种都行,那么呢,我们来试验一下。我来写一个新的controller。YNC在这一块呢,来说一步处理的事情。
01:07
好我来写,那么跟常规不同,我们就直接在这呢返回cable,这是要交给页面,哎,交给我们客户端的数据类型,好那个等一这有一个方法,Return来先直接turn到,好,我们来自己来一个。这一块呢,们来写string,没有实现的方法,我们来添加上好,然后呢,假设我们要给页面来返回一串字符串来,那我们就叫零一好,我们就把这一串返回吧。好,我想给页面呢返回这一串,但这一串呢,我们希望它写出去,而不是拿这一串作为页面地址来拼串。我们先来让他处理请求,来处理咱们这个ANIC01,好,我们让他写出去瑞Bo body,好,我们把这个我们来返回。
02:10
当然我们来可以跟以前的方式一样,我们来看一下它们是怎么执行的,如果这个方法进来了,哎,我在这呢,哎把它当成主线程,这个主线程的这个打印加上thread点。我们这个current包括呢,加上它的时间。Current a current minutes,好,我们把这个时间以及这个线程我们都打印出来。好,这是主线程开始,主线程呢结束。好,然后呢,如果我们业务逻辑方法在这,哎,那业务逻辑方法就应该写在这儿,我们来模拟一下thread.sleep来睡上两秒,那我们在这呢,就打印它的这个负线程开始。
03:10
负线程开始和线程结束。好,那完了以后呢,我们来进行测试,哎。我来启动一下咱们这个服务器。我们看了一下他们的整个运行流程。好,我来访问这个请求。这个请求CTRLC复制过来,好,等一等。大概过了两秒钟,我们这一串字符串被响应到浏览器上,那么呢,我们来看一下控制台的打印点开。好,我们这个控制台呢,在这儿,好,蓝器打印了proca,大家注意,主线程开始,主线程结束,他们用的是htp bio33这个线程这一块呢,诶,主线程开始跟结束几乎是同时的,而咱们这个副线程我们来看啊,也就是说我们在comable里边写的这些代码,它是在另外一个线程MVC安IC1在这个线程里边执行的,它这个执行呢,从四到六,哎,执行了咱们睡了2000毫秒,那这是我们这个cornerable的打印,但是为什么又会打印成这个样子,以它的这个原理是什么样的呢?我们这一块也做了解释,我们看一下spring VC的文档。
04:37
如果我们在用,那么呢,它下面的流程是这样子的,首先呢,第一步我们这个控制器会如果你返回了一个cornerable。一个控制器返回的不是以前普通的字符串对象控制器返回。
05:00
当控制器返回coral以后。第二步我们这个spring m VC就会启异步的启动一个处理方法,它怎么启动呢?他把我们这个able提交到一个叫task里边,在一个隔离的线程里边进行处理好,它呢就是说VC。异步的将。异步处理,它是怎么异步处理呢?就是我们这个提交的一个叫task。啊,任务的执行器,这任务执行器呢,我们来点进来就是我们啊这个guc包里边的ex旗下的这个task,那它是我们这个C定义的,它来执行咱们这些able的这些任务好,执行这多个任务好,他会把它提交到使用一个使用一个叫隔离的线程进行执行。
06:08
执行好,这是我们文档说的,那么接下来第三步,第三步,而且呢,和所有的filter将会退出咱们这个容器的线程,但是响应还依然打开,留在这儿,所以说呢。我们来说一下和啊所有的filter退出。退出线程,但是咱们这个退出咱们这个外表容器。的线程,然后呢,但是我们这个response还打开,但是response保持打开状态。它呢,保持打开状态,那还就相当于还没有给浏览器给响应,我们还能给response里边写数据,那怎么写呢?我们接下来第四步,第四步呢,我们这个Val会来产生一个结果,并且呢,Spring m VC会把我们这个结果重新的呢,又派发,把我们这个请求重新又派发给solid容器,然后呢,恢复我们这个处理过程,那么呢,咱们这个cornerable返回结果。
07:22
结果。C、将请求,将请求重新。重新派发给咱们这个容器,然后呢,恢复之前的处理,恢复之前的处理,然后呢,之前的response还在打开状态,可以接收数据的,好,那么怎么来处理呢?我们来看。然后呢,我们这个dispaure,然后呢,再次来执行恢复这个处理,因为我们这个如果还是把上一次请求再发过来,那么上一次请求是安THIC01,相当于dispa还是收到,收到以后呢,他再次执行来恢复我们这个处理,但是他怎么处理呢?就是根据cor宝返回的结果该怎么处理,该还是怎么处理,根据返回的结果继续处理。
08:15
犯规的结果,VC继续进入啊图渲染流程或者利用数据。继续进行试图渲染流程等。也就是说呢,当然它也是从头开始进行的啊,从收请求收请求。从收请求一直到啊,试图渲染给响应它从头再执行,因为请求会被再次发给spring m VC,这是我们根据档里的原理,包括呢,我们也直接在这个,我们现在到打,我们来把之前的这个打印拿过来。
09:01
我们会发现呢,我们这个普通的intercept,它是这样打印的。它呢,会打印一个pre handle开始,哎执行之前,然后呢,主线程开始,副线程开始又是pre handle post handle after condition,为什么呢,我们来看每一次handle怎么会是pre handle两次,哎,这正好解释了之前说的这句话,就为呢,当我们这个请求处理完,Able整完以后呢,VC将请求会重新再派给哎,咱们这个容器,容器呢,啊,我们这个收到请求,哎,但是呢,我们这个springc还是拦截所有的,相当于spring VC还是自己收到这个请求,然后继续进行之前的处理,我们可以完全在这看得到。加上request,第2GET request uri,我们就来看每次我们拦截的是哪一个请求。我们来启动。
10:01
启动。启动以后呢,我们要来进行处理好推车。来看控制台,哎,是这样子的,我们先发一个ANIC01请求,然后主线程开始,主线程结束,至此呢,哎,我们应该分为三段来看。按照人家的文档分为三段,主线程开始,主线程结束,这是一段,至此呢,以及所有的filter。及所有的filter及所有的filter dispar逻辑,包括所有的filter都退出现场,所以说呢,我们这个普handle执行了,但是呢,主线程目标方法一旦一截以后,哎,我们这个主线程目标方法在这主线程呢,一开始这个呢,哎我们点错了啊。主线程呢,在这一开始,然后呢,我们定义了一个able,我们返回cornerable,主线程结束,那么这次呢,我们dispar right退出流程,接下来呢,是我们的第二步,等我们cornerable啊,这是我们等待cornerable执行。
11:10
等待保执行。执行,然后呢,接下来就是执行完成。执行完成,当康able执行完成以后呢,哎,我们之前说了spring m VC呢,把按照康able返回的结果,把这个请求呢又会发出去,哎,再一发的话呢,相当于他自己又收到了一个请求,收到什么呢?来我们打印到第二次还是安西米克里一,相当于这个请求又交给他了,哎,之前收到的是安西米克利一,现在还是安西米利一,当然收到了,收到了以后呢,我们目标方法就不用执行了,Corner的返回值就是目标方法的返回值,哎。你说。的返回值,哎,之前的返回值。
12:02
就是目标方法。返回值,哎,目标方法就不用执行了,接下来呢,After comp照样来执行,这就是我们这个处理过程,当然我们看到的是如果异步的状态下,我们并不能拦截的真正的业务逻辑的整个处理,那么异步的拦截器。异步到南京去。用我们原生的里边的这个异步listen,专门有一个叫T使加叫listener,除了用这个异步的listener外。好,这是我们这个异步的连截器,原生的有两个,一个是如果是用原生API的,咱们这个异步的,这是第一种,当然如果我们用的是。那我们这个步请求的拦截器,那我们往下看啊,这有一个叫anthcept异步拦截器,那么异步拦截器呢,我们就会要要让我们实现安IC handle德特来实现这个接口就行了。
13:10
Spring VC的情况下,哎,我们实现实现这个接口来写一个拦截器,好,这就是呢,我们说的第一种方式cable,我们启动一个新的线程,包括spring n VC帮我们维护了一个异步执行的线程池,就类似于我们之前的。这张图一样来,我们主线程进来,我们spring mvc呢,如果是一个异步任务,我们会有异步的线程池来进行异步处理,我们这个主线程呢,会进行释放,然后呢,等待介绍下一个请求,但是呢,我们这个异步处理完了以后呢,把之前一直打保持打开状态的response,把这个响应先给他,我们来进行处理,这就是我们的异步任务。
我来说两句