00:00
好,接下来呢,你就来整体测试一下我们库存的自动解锁功能,自动解锁呢,咱们这个方法里边,那么这个方法呢,在解锁的时候,我们之前少写了一个逻辑,我们只有走到这一块呢,是解锁成功,那如我们是else else条件就是远程服务给我们返回的状态码不是零,那就是远程服务失败,那如果是这种情况,我们也应该抛一个异常出去,来告诉他这是远程服务失败啊,我就是远程服务失败,远程服务失败的话呢,我们也应该重新解锁,然后这个消息呢,不能算消费成功,那么这个呢算是解锁了,这个要重新解锁,然后呢,这个我们无需解锁,那这三种情况呢,我们都写到这儿,好来到我们这个方法的调用,只要收到异常呢,我们相当于把消息拒绝重新放回队列里边,让他们呢来重新消费,专门写到这个代码,那接下来我们来测试一下库存解锁的整个功能,来重启一下库存和订单这个服务。然后同时那在启动服。
01:01
估的时候呢,我们发现这个消息队列里边之前老有一个这个on CK的内容,我们先来给它把这个队列里边清空吧,好来清空看一下这个老是不ack是什么问题,把这个队列呢,先给它所有的内容给它清空一下,队列呢先是空的来做一个整体测试,那只要呢一切解锁成功,我们的这块死性队列里边呢有数据,然后数据呢来到这儿。那么最终呢,就会调用我们自动解锁的方法,好,现在来等待这两个服务来启动完成,我们来重新走一遍下单逻辑,来,我们来先把这个数据库里边的,数据库里边的这些锁定状态呢,我们现在都给改成一个这个零,没有任何锁定,包括库存工作单的这些详细信息也全部呢删掉,来从头到尾做一遍测试。好,现在呢,我们来测试我们下一个单,我们现在订单服务,库存服务,我们现在都启动成功没问题,然后呢,我们来重新刷新来做一个下单,好,现在我们这个订单呢,先确认好我们要下单,我们点一个提交订单,订单呢肯定会创建失败,但是创建失败呢,我们库存肯定加上去了,点一个,诶库存锁定呢加了,然后呢,这个订单的库存工作单也有,与此同时呢,我们这个消息队列里边就有一个两分钟以后过期的消息,我们有两个,你们锁定了两个商品,只要两分钟一到期以后,那就会触发,触发谁呢?触发我们的这个自动解锁库存的方法,我们这个自动解锁库存就会调用我们这个方法呢,来解锁库存,那么就在这儿来稍等一下,他们这个自动解锁库存的逻辑好,我们现在呢,看到我们这个消息队列呢,收到解锁库存的消息,那这个应该收到两个解锁库存的消息,我们现在呢,收到一个来看一下这个解锁效果们来先在库存这一块我们来。
02:50
刷新一下,诶,我们发现呢,有一个人解锁了,但是这个没解锁,没解锁的原因,我们也看到这只了,收到了一个库存的解锁消息,然后我们来看一下我们的消息队列,有一个这个消息呢,老是on AK,这个原因是什么?我可以去消息队列里边查一下,这个消息队列里边,诶这有一个属性叫consumers,那消息队列呢,他发现了两个消费者,那这个不对啊,我们这个解锁库存呢,现在应该只有一个消费者,就是他啊,我们之前呢,在这个创建我们这个rabbit MQ的这个配置的时候,来创建测试的时候,它呢也监听了这个解锁库存的消息,因为我们说它一监听以后,这些东西就自动创建了,那把这个呢,我就给它关掉,那把这个一关掉,只要我们服务一停掉,我们一服务停掉,然后呢,我们刚才解锁失败的那个消息,我们看现在呢,只有一个解锁了,解锁失败的这个消息呢,还会重回队列,因为我们那个服务呢,一直没给他ack重回队列,然后我们这个再将。
03:50
库存服务再启动一下,那一启动成功以后呢,相当于消息又会重新来到我们的这一块,那么呢,现在又收到一个库存解锁消息,所以我们这个实现的是最终一致,有可能我们刚才解锁了,第一个解锁成功了,我们服务器炸了,然后呢,我们这个消息就会派发给别人,别人呢再来解锁,来看一下我们现在启动的效果。
04:11
只要我们这个库存服务启动成功,我们就会把我们这个队列里边的刚才这个消息我们就会拿去消费,因为这个消息呢,之前没有ack服务器停止,它就会自动存到我们这个re MQ里边,在准备状态,准备往出发,来看一下我们这一块的效果好,现在这个消息呢,发出去了,发出去以后呢,我们这儿收到了库存解锁的消息,那又解锁了,那一解锁我再刷新,诶我们发现呢,这个也就解锁了,虽然我们分了两步解锁,但是我们最终保证了最终一致性,而且只要我们没解锁成功的消息。Re MQ这个消息队列呢,它就会帮这个消息存储,那们这个消费者呢,只要一启动,它就呢再发回来,所以这是我们的自动解锁功能,那这个自动解锁功能如果我们写的更完美一点,应该是这样子的,我们在这儿自动解锁,我们在这儿来进行解锁,好解锁,解锁呢我们相当于把我们这个SKU在这个仓库的数量,我们重新给它加上来,我们现在呢就自动解锁了,那解锁以后呢,我们应该做的还是这一件事,我们库存工作单里边,既然呢,你这个人已经解锁了,那你就把这个状态呢,给我改成已解锁,所以我们来看一下改变表,那么这个状态呢,已解锁就应该是二号状态,我们这个已解锁我就叫已解锁。
05:28
那一号状态呢,是已锁定,已锁定,所以呢,我们现在就来测试一下,那我们现在呢,把这一块只要我们这个库存解锁,我们这个库存解锁,解锁了以后呢,我们这个库存工作单也调整为解锁状态,更新更新这个库存,库存工作单的状态,工作单的状态,这个状态呢,库存工作单我们是这个其他的这个do我们就直接来注入过来,我们库存工作单,那就是这个工作单的这个service,好,我们就拿到它第二一个我们现在呢要更新状态,我们就可以来调用update方法,我们呢update把ID,我们按照ID把它的这个订单状态呢,我们全部来更新,更新成一个这个叫where。
06:16
我们的这个工作单order task这个状态我们主要来更新它,那更新它呢,我们就可以按照ID来进行更新,正好呢,刚才给这个方法传的时候,除了传这些信息外,我这个库存工作单的这个ID,就是工作单详情ID我们也传了,然后我们相当于呢来到这儿,我们把这一块呢,这个ID,它的这个商品呢,已经解锁了,那么就把它的状态变为二,为什么我们不直接拿着这个商品和这个仓库。拿这两个去查来编状态,因为我们可能别的库存工作单也是这个商品在这个仓库,然后呢锁了多少件,所以呢,我们一定要拿他的这个ID来查,咱们现在呢拿到这个来去修改,修改的话呢,我们给这个nity里边设置上两个就行了,一个是这个ID就是它,然后呢,它就会按照ID修改谁呢,你设置了哪个字段就修改哪个字段,现在修改我们这个锁定状态,二就变为已解锁,变为呢已解锁,这样呢才是一个完整的逻辑,好我们就不测试了,我们这块代码呢,就写完了来写完以后呢,我们在这前边的这个解锁,注意这个解锁呢,也一定既然我们状态都改了呢,我们来为了防止你万一呢解解的有问题,我们就应该将我们的这个当前的这个工作单信息,这是我们这个工作单详情的ID,我们可以来查出来,查出来以后呢,我们看到这,诶就是这个我们呢,已经查出来了,我们查出来这个状态,如果这个状态合适了,我们才解锁,所以呢,它的。
07:48
这个状态点get status,如果你的当前的这个锁定状态啊,不是已解锁的话,我才能给你解锁,你都是解锁了,那我们就不能解锁了,所以我们能不能解锁,其实只有一个状态,就是什么时候能解锁呢?就是你刚的这个库存工作单只是已锁定状态才能解锁,如果我们已经解过锁了,也就不用解锁了,包括我已经把这个库存都拿去都扣减了,正式扣减了,那就更不能解锁了,所以呢,我们现在只能是匹配一个状态,当它的这个状态是一,也就说我们这个当前库存详情,当前库存工作单详情我们这个。
08:30
状态是一,状态一就是我们已锁定这个已锁定,但是未解锁,但是未解锁才可以解锁,才可以解锁。如果是已解锁,我们就什么不都不做,那么这个消息呢,就直接给他发回,直接呢就相相当于消费成功了,因为我们都已经解过锁了,好,这是我们说的库存的自动解锁逻辑,那在下一节课呢,我们再来结合订单,订单呢我们一超时以后,还要触发我们库存的解锁,来看一下他们两个合起来该怎么做。
我来说两句