00:00
同学们,我们接着讲,我们刚才发确认消息这件这件事儿是吧,我们已经写完了,这个叫回调对吧,回回调接口。有了这个回调接口之后呢,我们不用想,一旦消息收不到,我们这个回调接口会被执行,当然了,这个接收到了也是会被执行的,只不过是AC是成功的是吧,如果接收失败了,那自然AC是失败的,会打印失败原因。但是这里面呢,有一个问题,就是同学们有没有想过它的第一个参数,这个东西它是哪里来的呢?天生就有吗?好,跟他们说天生直接没有,也就是说,也就是说你能接到AC,你能接到失败的原因,但是实际上相关回调信息是没有的,对,是没有的,那么这个信息从哪来呢?从发送方,也就意味着从发消息这个位置。发消息这个位置,同学们平时我们用的方法时,有大量的重载方法,你看啊,它这里面有有一大堆啊,这一大堆重载方法,这重载方法当中就有一个,谁呢?
01:13
这儿呢,你看。这个方法当中就多了一个这个是吧,这个类,而这个类你再看一眼。Cor,你看他眼熟吗?是不是就是他呢?你看是不是他呢。对吧,哎,你看是他是不是他是他。也就意味着这个东西是在你发消息的时候,你自己填写的,你要是不填,那他也没有。所以怎么,所以你需要自己填写一下是不是自己。自己去写一下啊,那叫什么名呢?来粘过来啊,叫什么名我们没记住啊,只能是把它粘过来了。粘过来之后,那这名字这就来了。完了这里面你看创建一个对象之后呢,这里面有几个参数,你看有一个叫ID,还有一个叫回退回来的。
02:09
回调回来的消息,也就是说里面会有消息内容呗,相关信息呗,这是为什么,我说有个ID,有个消息的相关内容,你看这里,因为它里面已经有了。那我们本身不关心消息,关心的是ID啊,因为什么,因为回调接口里打印的是ID嘛。所以你在发消息的时候强烈建议。写上ID,当然了,它的构造器当中有空参的,也有一个有参的构造器啊,有一个ID的构造器,所以呢,你这个位置填写一个呃一呗,例如ID1你不自己写嘛,是吧。你自己写个ID。对完之后呢,紧接着你再把它放在第四个参数上,哎,这就行了。你要是愿意再放一些消息进到里面也是可以的,我们并不关心这问题啊,我们只关心的就是这个消,这个对象确实是,呃,我们自己创建完就发发走了。
03:08
好,咱们试一下啊。起伏。咱们把控制台清一清啊,咱们现在没有毛病啊,现在是没有毛病的,咱们再发一遍啊刷新。刷新完之后,同学们看一下子有没有进行应答是吧?哎,发现没有应答,对,没有看见应答,那我们我们的这个回调。是没有生效吗?看一下。我们这个生这个回调叫。注解儿打了。累。注入了。该写的也都写了。那么我看一下扫描包扫没扫他。
04:00
走了。完了,我们有什么,我看。控台。发送消息。接受消息是吧,哎,这都没问题。那我们这个回调接口之所以没生效是因为什么呀?是因为没有进行配置。这个回调接口要想好用,首先呢,你必须得在上方啊,在这呢,你看要想好用,你必须得配置文件里再加上一句话表示。交换机。对要进行确认,你看发布者确认类型改为。什么改为交换机模式吧,那么咱看一下是不是啊,上面呢,有这么一个说明叫rabbit MQ发布确认类型为他,那么它是什么东西呢?它有三种选项,第一种。什么都不写。禁止禁用发布确认模式,注意是默认值,我们现在什么都没写情况下,它走的是默认值,就是禁用发布确认模式,也就是说没有使用发布确认模式,所以导致咱们那个回调接口根本就不触发,那么如果改成下一个呢?这个是吧。
05:17
叫发布消息成功,到交换机后会触发回调方法。那也意味着你改成哪个,改成这个,你看它这个例子也是要求改成它。完再往下还有第三种叫简单方式,Simple吗?简单吗?这个呢,经过测试有两种效果,第一种效果就是跟第二个触发回调方法是一个值啊,是一样的,另外一种发布消息成功后,使用temp调用等待回调。对,等待回调确认,那么以等待这个节点返回发送结果。根据结果统一判断下一步逻辑。需要注意的是,它方法如果返回false,则会关闭心道,再接下来就无法发送消息了。
06:07
所以simple它会有关闭心道的风险,同时这个simple也是咱们之前学习的,叫同步。确认消息同步确认消息的意思就是我发一条就确认一波,发一条确认一波,咱们曾经很早之前已经测试过一次。如果你发一条就确认,发一条就确认浪费时间对不对,浪费时间咱们之前都曾经写过那段代码。对,代码在这呢。我们当时还测了,只要单独发布,同步发布,异步发布,诶会产生的一些个效果,我们也都。演示了。我看在哪里呢。这个效果。得大,你看。
07:01
当时咱们都测过了,知道单个确认,批量确认是吧,还有异步确认,三者耗时。这种你看722秒,147秒,还有62和47秒,哪种最好批量异步确认啊,批异步批量确认。是最好的,那么一旦你要用了第第哪种,第三种,它就是相当于是前面的单个确认。对,发一条确认一波,发一条确认一波。是吧,哎就就相当于它了,我们最好就不要用它,用谁呢?用第二个。那么咱们相当于在配置文件里要加一句话,就这句话打开咱们的配置文件。这个项目收起来,咱曾经写过是吧,关了吧。完了呢,把这个配置文件打开完了之后,咱们在这啊一粘对,只要一粘这就开启了一个交换机确认。
08:00
毁掉,所以呢,你再重启服务。把它重启一下。那么一旦开启之后呢,它势必会掉咱们这个接口了,哎,掉咱这接口呢,就会打印打印这个相关的信息,我们来试一下。是不是这个原因是吧。来看看。好,你看打印没打印,打印了啊,这个发送消息内容为大家好,完了最后接收到消息了吗?接收到消息了,完了交换机确认了吗?确认了,你看交换机已经收到ID为一的消息,你看这么发这么收挺好吗?这是正常收到了,那如果收不到呢,为了演示收不到我们怎么办呢?我们最好是把这个发送的部分,将交换机的名字给它微微的改错一下。对吧,改错一下子怎么改的这么大,这不是交换机的名字吗?对吧,我们在交换机的名字背后再偷偷的加一个123。拼接一个123,是不是交换机名错了,错了时候就发不去了,发不过去了,发不过去了不就会出现。
09:07
发布成功是什么效果吗?所以我们再发布一次试试。好,来再发一下试试啊,发发。发完之后,这次发送肯定是失败了,你要知道。发送内容是大家好一,但是很可惜,你看马上。交换机还未收到IDV1的消息,由于什么原因这呢?说信道当中出了问题,出了什么问题,信道关闭了是吧,为什么呢?因为信道当中报了一个。404。具体解释叫not found表示未发现,未就是没有交换机,叫这个名字的,你看后面交换机是不是多了个123?对,根本就没有这交换机。这就是失败的原因。
10:02
对,所以呢,我们失败之后,交换机有没有给发回回调,回调的方法发这个确认呢。发了,只不过是失败。一旦失败了,我们是不是可以把这个大家好,这个一进行存储啊,以待于以后重新发呗。至少我们现在可以知道是吧,可以进行回调,全诶,失败了,消息能丢失吗?不能丢失,因为我已经知道消息失败。对吧。没问题是吧,没问题,所以呢,我们呃,已经解决了,咱们之前上课之就要说的内容,就是一旦交换机收不到消息,我们能不能重新发送,是可以重新发送。那反之。那如果是下一个交换机倒是可以了,那么一旦交换机没问题啊,注意它没问题,如果队列有问题呢。对吧?如果队列收不到消息,我们生产者能不能知道呢?
11:05
好,如何测试呢?很简单。把K1改了呗,把K1改成K2,那么K1能发消息,那K2显然是不对的吧?那要是发个K2,那么他还能收到消息吗?就不能了,那么我们看看队列,要是收不到消息会有什么后果?那么咱们怎么发呢?这么发将交换机改正确了。对,把ROK给他改错了,当然我们也可以发两个啊,先发一个正确的。对,那这呢,我先把这个复制一下,发一个正确的,完我们在下面呢,再给他发一个错误的,而发一个错误的呢,这个ID在改名了,就二了啊就二对这个是一,这个是二,完了咱们用这个一的是正确的,二呢是错误的,二当中怎么错呢,把这个地方。给他再追加一个二对交换者交换这个这个肉天K是吧,K1是吧,K1再加个2K12呗。
12:08
是这样吗?是这样。没问题是吧,没问题,发几遍发了两遍,好,我们再重启一下。那么这回你同学们猜一猜,我们能不能收到回调呢?能不能收到失败的回调,注意一个是成功的,一个失败。好,跟他们说收不到,咱们一起来看一下啊。咱们发一下试试。他发了。发完之后,同学们看到发消息内容有几个呢?大家好,一发几遍,发了两遍啊,第一遍,这是第一遍,这是第二遍,第一遍成功了吗?成功了,你看交换机已经收到了ID的消息。是吧,完了呢,这儿呢,交换机已经收到了idvr的消息,注意怎么感觉像两个都成功了是吧?注意是您打的内容非常清晰啊,是交换机已经成功收到了,他并没有说队列。
13:05
完了呢,队列当中,这接收到队列当中的消息,大家好,注意只收到几份一份,那第二份呢。对,第二份没有。发现了吗?发现了。第二份没有,也就意味着只接收到了一份。完了这么打印呢,实际上呢,其实不是很清晰,我们最好在发消息的时候把这个ROK给它加上,这样就知道是哪一个出了问题,对吧。把这个。这个是K几啊K1是吧,这是K1完之后呢,再加上K2。再把下面这个。加上这是K12是吧,K12完之后,那边收消息的内容自然就会变。我看在哪呢,消息这。所以把这儿啊加上K12。把这加上K1消息,好把它发的消息内容咱们改了一下啊。
14:03
这样呢,更加清晰一些。其实跟刚才的结果应该是一模一样,对,一模一样。只不过是我们。把把这个输入的内容啊,打印的更加清晰一些。走一波刷新好来了。啊,这就这就清晰多了。怎么清晰呢,你看说大家好啊K1对吧,大家好啊K12。完了呢,两个都交换机都收到了吗?都收到了,但是队列只收到了K1,没有收到一二,那是因为什么原因?那是因为这儿。只要交换机成功,注意啊,只要你送到交换机这个位置,它就会应答成功了,但是队列其中只有一个成功,另外一个是失败了,所以导致导致消费者,消费者是吧,只收到了一个K1,并没有收到K12。所以相当于队列有一个没收到。
15:02
那么没收到队列,他应答了吗?他也没有应答,他也没有,他也没确认,对吧,你看现在只有交换机都确认了,而且都是成功的。所以这是个问题,不是个问题。
我来说两句