00:00
同学们,我们接下来讲一段。核心代码什么核心代码呢?就是发布确认的一个核心代码。咱们正常情况下不出任何问题,发消息这是一点儿问题都没有,对吧?那我们就怕出问题,什么时候出问题,就怕交换机出问题。或者是队列出问题。对,这两个都是可能出问题的,也可能是一起出问题对吧,那么一起出问题,这个问题算谁呢?算交换机的,因为他发消息是发发给交换机的,那么交换机已经出问题了,那后面即使队列不出问题,那么也是交换机的问题。好吧,那么对于这种极端情况下,注意很极端啊,因为正常情况下他们是应该不会出问题的,因为他们是一个集群,将来咱们是要搭建集群的,那么万一啊,咱也说万一万一出问题了呢。那就怎么办呢是吧,所以我们写一个。回忆。调接口回调接口,也就是我们的发布确认,这种高级呢发布确认。
01:07
高级部分是什么?重点是回调,对,重点是回调。什么回调啊,就是当你消息发不出去了,你要能把它返回来。保存下来。对保存下来就就就有再发的可能吗。那么怎么才能保存下来呢?重点就看是谁发的。是生产者发的,那么生产者自己发出去了,如果交换机没有回应,作为生产者你是不是应该感知到啊,感知这个词语啊,感知就是感知到他没有收到,那我是不是应该重新发送啊,对吧?那怎么感知呢?它就是通过这个回调接口来完成的。这个接口是谁的接口呢?重点说一下,它是生产者发消息,这个叫play,这个接口里面有一个。
02:03
要确认。回调接口。什么叫确认回调接口?就是交换机本身自己,他要需要收到消息,需要确认的,他如果没有确认,或者是回确认了,但是呢,确认的内容是失败的。那么都是认为。发消息失败了。对,所以如果你能写这么一个回调接口。这就会导致生产者一旦发消息发不过去,那么这个回调接口就会被处罚,处罚之后呢,将你发的消息就回调回来了。这就解决了我们消息发送过去不能被交换机所接收,那么如何重新发送的这么一个问题。对,这就是一个回调接口。那么这个回调接口怎么写,大家一起看啊,首先呢,是谁发的?同学们都清楚,是生产者发的,好,那我们来看一下。
03:01
既然是生产者发,生产者是谁?你看这是生产者,注意这是生产者发消息了,谁发的,他发的,那么在这个类的里面。咱们打开啊,看一下源代码是吧,这个类的里面就会有一个叫con。对,你看come回调接口这呢。这个是一个内部的接口,怎么叫内部呢?正是在这个叫的里面有这么一个接口。而这个接口就是一旦发送失败了,或者是对一个叫回退接口,回调接口。那么咱看这接口。这个接口呢,还是一个函数式接口,里面只有一个方法,这就意味着我们可以用呃,拉布达斯表达式,当然了,你也可以写一个实现类。来实现这个接口,因为这个接口在正常情况下这个接口是没有被实现。
04:01
对,至少实现的也不是我们想要的,对吧,所以我们想要一个自定义的一个实现类来实现这个接口。一旦交换机收到消息或者收不到消息。都会调取这个接口。那如果他收不到调的接口,它返回值当中这个位置,哎,就是一个。False就表示失败了,那如果成功了,这个位置会返回一个处,表示成功了。完了,这个是原因,如果是失败了,那失败的原因是什么?这个是。当然是发送的内容是吧?啊,什么内容发送失败了啊,失败了是什么原因啊,就这么脏参数。所以势必就让我们怎么实现这个接口,来一个实现类,所以接下来的任务就是在这里面你要创建一个类,这个类的名字他都给起好了吧,哎,记好了名字就叫。MY。Call。
05:01
对,这是它的文档上起的名字是吧?完了,这个名字必须实现一个接口,接口名是rabbit。Plate的一个内部的一个接口。这个接口一旦被继承之后呢,一旦被实现是吧,就会有一个未完成方法会下来这个方法。注意这看这个方法就是交换机。确认。回调方法。交换机的这个方法呢,它是什么情况呢?是。成功或失败都是要进行回调的,也就意味着交换机比较勤快,有多勤快呢?知道这个回调方法什么时候会被调用呢?第一。这个叫。发送。发消息。交换机接收到了回调吗?回调。
06:02
只不过回调的内容当中啊,咱们写1.1 1.1表示的是第一个参数是吧,哎,第一个参数它。就是里面会保存着。回调的。消息的这个叫ID及。相关。信息。1.2。就是这个参数是吧,这个参数啊,这个参数B是吧,这个参数B的话就应该叫AC是吧,应答完之后紧接这个是原因啊。对,完了,紧接着再写上第二个参数表示的是。交换机。收到消息了。那么为多少呢?为处呗。一点儿三呢,就是。失败的原因,那么如果不失败的人成功了呢?那成功是没有原因的,所以如果成功的情况下,那么这个。他应该是个nu,对,没有没有没有没有原因。
07:02
第二个,那么如果发消息。交换机接收失败了,对回调吗?回调。那么就写2.1是吧,2.1,那么还是他呗,那他依然返回相关信息啊,这没什么变化,那第二个呢,交换机的交换机的这个收到的信息,那么收到的这个信息,这个确认是吧,这是2.2。他就是什么呀,就是。对。这个AC是吧,AC就变成false,这个是AC是true。所以可以通过A来判断到底是成功了还是失败了,那这个就是原因呗。来了2.3。它就是就是引起的,哎。失败的原因?对,完成。所以说这个方法,有了这个方法,我们就可以知道交换机确认成功啊还是失败呀。
08:06
对吧,完外加同同注意一下,这个地方类必须怎么呢?必须打上注解进行实例化,一定要小心打,注意实例化。同时呢,如果你为了打日志呢,你最好是再加一个SL是吧,复接。完之后呢,紧接着这里面你根据谁呢?根据a cck判断,如果a cck是true,成功没有成功就成功了呗,那成功怎么办呢?那你当然用日志啊,Log个日志是吧,哎进行打印这个正确的信息。那么反之,Else失败了呢?失败了也得打印信息是吧,一样的啊,也说成功了,你打印信息,失败了,你也得打印信息,打印一下,打印一下交交交换机。已经收到了。消息,当然ID是多少啊,ID为。IDV。
09:00
完了呢,冒号完了一个站位符。的消息完了呢?ID是多少呢?IDID咱也不知道是啥是吧,其实ID在哪呢?在在这里面呢,这里面有ID对吧,这里面有我们来取一下试试啊,看能不能取到。点上。Get,你看这不ID吗?对吧,这ID,呃,怎么说呢,这ID如果是对吧,如果是那支。如果是什么值对吧,这得判断一下啊,首先不能直接掉啊,必须得正常的判断一下。就例如他们不等于。不等于闹。完了呢,如果不等于nu的话,就正常取它的这里面的ID。否则呢?取空串,对,就这么个意思,我快速返回拿到ID啊,就是这是一个三元运算是吧?三运算啊,因为你可以写它直接不等于空完之后去取值也可以啊完我们写个三运算,这不就ID吗。
10:03
哎,这个消息的ID拿到了,反之。如果失败了,那么你四壁在这个位置要打印交换机。还未收到对吧,哎,交换机。还未收到ID为某某的消息,那ID是什么情况?完原因是吧,等会还得写个原因逗号,呃,由于由于元音冒号。完了再加个占位符,再把后面的元音再填里。这不行了吗?是吧,哎,能打印这个效果就可以了。那我们发消息的时候呢,要小心,首先呢,我们这里面写到这儿呢,其实并没有写完。为什么没有写完呢?因为我们的实现类虽然写了,实例化了吗?实例化了,但是同学们可能要忘记了,你继承的或者叫你实现的这个接口是一个内部接口。既然是一个内部接口,那么你直接把一个类里的内部接口实现之后,写了一个实现类,而这个实现类在这个对象的理由呢?
11:10
并不在,所以导致将来他在调自身接口的时候,根本调不到这个时间位。对,所以你把你写的时间类应该怎么办呢?应该在注入到。这个类的里面的接口里。就对了,所以这里面缺少了一个。注入。注入到哪里,注入到这里的。对吧,做到这里面的话,那你首先第一步你得先。先注入一下,这个叫L。对,你得把它先注进来,第二步你呢,应该将当前的类注入到这个类里面的这个接口上。他才能调到自身的接口,才相当于调到这个时间内。所以接下来真正的注入来注入在这儿。
12:05
叫public void in来这么一个注入的方法。将当前的类主要当前类就是days的意思。对,注入给谁呢?注入给他。里面要通过set方法设置进来,你看。这个地方写。塞进来。所以这就注入进来,哎,这就注入了。注入了。这注意了,但是这个方法并没有人执行啊,所以呢,你最好打一个注解。这注解叫就叫post什么?Control,对,这个就相当于。注入啊,注入的这么一个注解。这样的话,你会发现它的执行步骤是这么执行的,首先第一步骤先执行这个类的实例化。
13:02
第二步骤呢,是执行凹凸二注入,第三步骤它会执行这个注解,对,一定要记住这个注解要在第三步执行。那不能超过第二步,对,这是第一步啊,那么它三步如果超了第二步,后果很严重,因为当你注入的时候,如果你第二步还没注入呢,就根本就没有这个类。没有这个类的话,你再通过这个类掉塞的方法,肯定会势必报空指针异常。所以一定要小记,为什么要用这个注解呢?因为这个注解是在其他注解都执行完成之后,它才会执行。这样的话就能够成功注入了。注入完之后,这个回调的这个咱们那个是吧,这个回调时间内就算写好了。
我来说两句