00:00
好,前面呢,我们说了一下返回cable这种方式来完成异步请求处理,然而实际在开发的过程中,我们这个异步请求啊,不可能像可能包这么简单,那么我们来看一个实际的场景,比如说它我们以创建订单为例,假设呢,我们这个请求开始我们要创建一个订单,而我们这个应用一它呢要启动一个线程来帮我们完成这个请求,但是呢,假设它并不能创建订单,创建订单呢需要应用二来完成,那怎么办呢?他可以把这个创建订单这个消息呢,它放在咱们这个消息中间件中,比如我们这个re MQ、卡夫卡等等,而我们这个应用二呢,就负责监听咱们这些消息中间键里边的消息,一旦他发现有创建订单这个消息,那么他就进行处理,将处理完成后的这个结果,比如将咱们这个订单的订单号等等等等。
01:00
处理完了,它又返回放在咱们这个消息中间键中,那我们这个线程二呢,就来监听我们这个消息中间键的这个返回结果,哎,他这个订单一处理完,他拿到这个结果,把我们这个结果呢,就来响应给我们这个客户端,这呢可能是我们的一个实际场景,当然我们接下来呢,不可能来完全来编写我们这个应用二以及这些消息中心件,我们就呢做一个大概的演示,那如果是这种场景呢,MVC也有结合我们这些消息中间件的这些场景,它利用这个就说呢,你可以来这么来做,当你发一个请求以后,你的这个消息不能及时得到处理,没关系,你先一个def result这个对象,你把这个对象呢先返回出去,那返回出去呢,那这个请求就在等待处理过程中,你把这个对象呢,先保存在一个其他的地方。
02:00
在什么时候这个请求能完成呢?当别人另外一个线程在其他的地方假设呢,拿到了这个对象,他呢,给这个对象里边只要调用了set result,也就是说只要它设置了结果,那么我们这一块的东西就会得到响应。好,我们把这个简单的场景呢来模拟一下。我们来写一个方法,好,这个方法呢,我们假设就要创建订单,我们来返回DEF。好,稍等我来,在这呢,让他直接来返回defer,哎,咱们result返回这个对象,好,我来写一个object,它是一个创建订单。好,我来return,那处理的请求是request,比如呢,它就叫创建订单create。当然它呢,并不能真正的来处理订单的创建,那么呢,我们需要另外一个线程来处理好,我们不写的那么复杂,我们先来把这个dier result我们来拗出来。
03:13
来,我们来又一个dier result等于又一个dier,好,那先呢,把它创建出来。好,我们先把它创建出来。走创建的时候呢,我们还可以来传一些参数,比如我们这个超时来假设呢,我让你三秒必须执行完,执行不完,如果超出时间以后的这个错误返回,哎,我们也可以全部写在这,我们就来用第二个,比如呢,我们来限定它必须三秒内完成,这个东西呢,必须是一个浪性的参数,好我们就把它转为了,然后呢,如果说完不成,我们可以给一个错误的提示消息,比如呢,我们就叫create创建失败,好然后呢,我们把这个defer result返回就行了,来当然我们把这个呃消息呢,我们来写出去啊,我们用response body来写出去啊,不让它跳转页面,我们来做一个简单演示,好我们来运行起来。
04:19
如果是这种情况,我们来看一看,现在如果我们默认来访问,但是呢,没人给这个defer result里边调用set啊,Result方法给它放,那么我们来发这个。它呢会等待三秒,当超时了以后呢,给我们快速的来响应,哎,Create file,这就是失败了,那接下来呢,我怎么办呢?那我就来模拟一个队列,好,我在这呢,我来写一个,比如我们就叫dier result。Did。咱们这个。
05:01
Result qui,我们就给它整一个这个quick,然后呢,我点一个finish,它呢就来里边呢就来有一个方法就呢把我们这个dier result萤石保存起来。C,好,因为呢,我们在这儿每一个方法呢,可能会产生一个dier result对象,我们这个方法呢,就是把这个different对象先临时保存起来,保存在哪呢?就在这儿来写一个变量static啊,不是word,我们来写一个咱们这个K类型的变量,好它里边呢,就来存这个玩意儿。成result好来写一个困,等于你有一个,哎,我们就来用咱们这个concurrent,哎,Link的困你就用它吧,好然后呢,只要有这么一个对象,我就来给里边来保存,我们来点一个and,好把它保存过来。
06:02
然后呢,当然要提供一个获取方法。我们来提供一个获取方法。好,这个呢,你就叫get,或许呢,那就直接从空里边来拿出来这有一个布,哎铺拿出来这个布呢,是啊,我们retrive查询,并且呢移除,哎只要把这个移除队列图的这个内容,好,我们把它返回出去,好做一个简单演示,好那接下来呢,我们在这当我们要创建订单,但是呢,这个请求我们并不来处理,我们先呢可以把它保存起来叫。我们用这个differ的困,我们自己写的它那些呢,把它临时保存起来,那接下来怎么办呢?假设呢,有别的线程专门来监听这个事儿,当然我们就不写监听了,我就在这来写一个啊,他来是真正的来处理订单,Return一个行,Return一个success,好我不写监听了,我就手工调一下这个方法就行了,好,那我就写一个request。
07:12
他呢,叫好。我们把这个success写出去,还是一样response来写出去,好在这呢,我们来给它创建订单来订单呢,我们就直接用UU id.random u u id.to就这样就行了,假设呢,我们就在这创建了一个订单order,那接下来上一个请求,哎,我们要用订单怎么办呢?哎,我们从这个困中拿出我们刚才保存的这个differ result,哎,这有一个get方法把它拿出来,然后呢,我们只需要给它里边。点set进行设置,设置什么呢?设置我们这个订单,好设置我们这个订单,那么呢,当我们发一个create order创建订单请求,我们先临时保存起来,只要它触发了,把订单设置进去了,那它就会立即得到返回,好如果我们这个订单返回了,我给这个success,后边我们来打印一下我们自己来创建的订单,跟他这个方法来返回的订单是不是一样的。
08:25
来访问一下。走。好,启动起来。好,我们把它呢,放在外边的这个浏览器上。好,外边的浏览器上有两个请求,哎,我们来给它一起发,一个叫create order,叫创建订单,但是呢,我们希望它三秒以内就得创建完,然后呢,我们会调用这个create方法,我们手工来调这个方法,这个方法呢就是啊给它产生底难好进create order,好,我们在这create创建,那们在这呢,创建了一个六三第三订单,我们在这看到诶会返回六三第三,比如说呢,我们模拟了相当于我们另外一个线程拿到你的defer的result,把我们处理的结果只要给你设置过去,我们这边就能得到返回,这就是我们这个dier result的使用。
我来说两句