00:00
我们上节课呢,已经把。消息手动应达到。消费者已经写完了。按照图来看,生产者写完了工作线程,也就是消费者写完了,C1呢已经写过了,C2呢也写完了,C1C22个呢,我们都写完了,咱们来看一下。C1你看我们的C。呃,可以接收的,接收消息之后。沉睡一秒钟。那C2接收到消息之后呢,沉睡30秒,好,接下来呢,我们一起来测试一下。看看效果。要达到一个什么样的效果呢?咱们咱们一起看一下文档。效果呢,是生产者发送AA。又发一个BB。当AA和BB全发完之后。C就会在一秒之后收到AA,因为它沉睡,你看时间较短,多久呢,一秒。
01:03
C2呢?沉睡时间较长,多少?多少秒呢?30秒。对,30秒之后呢,它可以收到BB。但是如果在这30秒之内出现了任何的故障问题。例如宕机,挂掉等问题,那么就会造成C2有可能接收不到BB,或者是接收到BB之后呢?出了问题。避避,这个消息面临着丢失问题。我们不可以让它丢失。我们应该让这个BB的消息。如果C2出问题了,BB的消息应该由C1继续来完成。所以我们正好要演示一下手动应答的这个效果。消息不丢失。并且即使C2挂掉。停掉,那么消息也依然由C1处理完成。好,我们来一起看一下的效果。首先呢,我们先把C1和C22个消费方先启动起来。
02:04
来启动一下程序。走这个慢函数启动。启动完成的报错了,那是因为信道里面没有新的队列。例如队列名字叫。A,队列,所以需要先发个消息来创建一个队列,所以我们先发消息。因为这里面有一个队列的声明。队列的声明呢,可以让咱们的MQ当中有这个队列,你看现在MQ当中只有一个叫hello的队列。并没有A队列,所以需要先执行发送。发好了。发好了之后呢,这个只是创建了队列啊,咱们可以看一下刷新一下,你看来了个AC的队列。但是这个队列里头没有消息。那是因为还没有发,我们就来发一下。
03:00
通过控制台输入AA。就可以发了,咱不着急发,为什么不着急发呢?因为咱们现在马上要将另外两个。对另外两个谁呢?消费者启动起来。好,现在启动可以没问题了,现在启动一下启动。完了再启动一个C2啊,消费者。好,我们一起来看一下啊,我们现在是一个发送消息的控制台输入,例如AA。我没有回车,我没有回车呢,就没有发呢,那么一会儿。消费者C1他就能接到消息了,消费者2C2他也能接到消息,只不过C一时间很短,C2时间很长,那么咱们呢,少少改了个字啊,咱们把C2这里时间较短改成较长。因为它要沉睡30秒,所以我们可以重启一下。
04:03
好,重启了,重启完之后C2等待时间较长,C1等待时间较短。咱们一起来发一发,试一试。首先呢,由于是轮询分发,所以呢,我们发送AA的时候,应该只有一个消费者能接收到,你看回收了发了谁收到了呢?C收到了。C2没有收到。所以你再发一个BB。再发过去,发完了,那么这时候就由C1接吗?不由C1接,该由C2接了,那C2为什么到现在没有接到呢?是因为C2是沉睡30秒,也就意味着我们在这里面要等待。30秒。等待的时间是比较长的。30秒之后,他就会接到BB。在咱们说话这这段时间里,应该已经过去了大约十秒钟,也就是说还有大约十,呃,20秒左右好收到了,我们计算错误是吧,正好30秒已经到了,收到了BB,时间非常的长。
05:09
这就证明呢,C2呢,可以理解为它的工作时间比较长,C一时间较短。那么我们如果继续发送,例如发送CC。这时候又由C1接手。而C。也能够时间较短之内就接到,那么C2是不是还要较长时间,所以我们发一下试试啊。CC。DD。CC已经被C1接到了,DD有没有被C2接到呢?没有,那么如果这个时候C2出了问题,例如挂掉了啊,我点一下子关关机啊关机。相当于C2挂掉了,C2挂掉了,那么相当于DD是不是丢失了呢?并没有丢失。而会转发给谁呢?转发给C,一、你看C已经收到DD了。从而证明我们的MQ有消息手动应答的能力。
06:06
就是只要没有收到消息,他是不会进行手动应答,从而呢将消息放回了队列。放回了对这个队列,而队列呢,又再次将消息传递给了C进行重新消费,所以导致DD这个消息并没有丢失。原本由C2消费的东西,改由C1消费。而C2已经挂掉了。所以消息并没有丢失好我们演示的效果,呃,很成功啊。
我来说两句