00:00
好,接下来呢,我们就来创建一个工程整合测试软MQ,我在这呢创建一个新的工程,使用spring的初始化向导,报名呢,来come,点按硅谷好工程名呢,我们就叫spring boo02啊,我们来测试AMQP。好,把这一块报名呢,我们也变成这个AMQP,好下一步选中我们的版本1512,然后呢,我们需要在整合这个模块里边啊,由于我们是re MQ,我们可以把它勾上,如果我们用的是其他类型的消息中间件,比如卡夫卡、MVMQ等等,就勾上相应的就行,然后呢,为了测试方便,也可以来引入这个web模块,我来点下一步点个finish。那么这个工程呢,我们就创建出来,我们打开呢,看一下它的这个po文件,诶它呢引入了springbo start amp模块,这个呢,主要我们来点进来,它引入了我们消息服务整个模块包括了引入了操作模块,那怎么配置使用呢?哎,我们说有了spring BOO,只要引入了相关场景依赖,那么一切都是自动配置的,我们可以在这呢,先来分析一下自动配置原理,Re MQ给我们自动配置了哪哪些自动配置,那么这个自动配置呢,我们就来找一下和rabbit MQ自动配置相关的类,那么有一个叫rabbit auto configuration,哎,这个类,这个类呢,翻译过来就是rabbit MQ的自动配置类,这个自动配置类里边帮我们做了什么?好,我们在这记录一下,这是这个自动配置类。
01:53
然后呢,他给我们配了哪些,来进来看这一块呢,给我配了这个连接工厂,哎,这是人家帮我们配好的连接工厂,有自动配置了连接工厂。
02:08
从这里边呢,可以获取跟rabbit MQ的连接,而这些连接信息呢,比如我们这个主机地址,用户名、密码,还有我们这个we house等等,都是从这个config里边得到的,Config呢,就是我们这个rabbit properties点进来,它呢其实是和rabbit MQ配置相绑定的,这些配置把它复制过来,好,这个里边封装了咱们这个rabbit MQ的所有配置,那么呢,我们就来配置它们,找到我们的配置文件,好,我们来写上rabbit MQ的相关配置,首先rabbit MQ的主机地址如果不写,默认是local host,那么我们来写上我们的IP地址。
03:01
端口呢,这个HTP不用写,我们写HT地址,HTP是页面访问地址,好呢,还有我们这个m rabbit MQ那用户名,用户名我们也写上,哎,这是用户,还有我们的密码。第二。Password,这是密码,也叫还有我们这个端口rabbit MQ的这个端口点。Port这个端口呢,不写,默认就是5672,哎,我们这个MQ它在这一块客户端连接用的端口AMQP的端口就是5672,没什么问题,好,所以这些呢,我们就可以不写,这三个属性呢,我们就配置完了,这个we host属性呢,我们之前有说过是一定啊,一定要指定的,但是呢,我们也可以不指定,我们可以看一下rabbit mq.virtual host,这个virtual host呢,如果说我们不写,诶你看如果是空串,它默认呢也是来访问斜杠,所以呢,这些都可以通过配置文件来知道。
04:14
好,把这些注掉,这个配置呢,我们就基本写完,但是我们如何给rabbit MQ发送消息以及接收消息呢?那还可以看这个自动配置,这个自动配置除了给我们放这个连接工厂,哎,我们来往下翻它呢,还会给我们放一个叫rabbit template,哎,给容器中来加一个它,好,我们来把它复制来。这个呢,我们来也写上,还有一个这个rabbit,他这个呢,就是操作啊,给给我们这个rabbit MQ发送和接收消息的MQ发送和接收消息,这就像大家以前用过的JD bc tablelate red tablelt等等,那么它还有什么呢?我们还可以在这继续来看,除了rabbit tablet,诶,我们来看它给容器中还放了一个AMQP的in。
05:12
这AMQP,我的命呢?它是MQ的系统管理组件。软贝MQ系统管理功能组件,哎,他呢不来发消息和收消息,它呢可以帮我们创建声明一个队列,声明一个创建一个我们交换器等等等等等等,这个呢是我们自动配置给我们里边放的这些组件,我们呢就用rabbitt来尝试发送一些消息,我在这个测试类里边。好,测试类里边我把这个rabbit table我就来自动注入,哎,既然他给我们已经有了,那我们就自动注入进来,我们呢尝试给我们这个消息队列里边发送一些内容,发送什么呢?我们来测试几个消息,第一个哎,我们说的这个单波啊模式下的这个点对点消息,哎,我们将一个消息发布到一个队列里边,怎么发布呢?我们可以使用rabbit table点两个方法,第一个send send呢,它传入exchange,就是我们这个交换器,哎,消息呢,先给交换器,交换器呢再来传一个路由件,根据路由件我们放到哪个队列里边,后边这个呢,就是我们要发的消息,但这个呢,需要我们自己来构造一个消息来,我们来写上第一个呢,传一个交换器,第二个传一个路由件,Root key,第三个呢,传一个message来,我们可以。
06:47
利用这个方法。Message它的这个好处呢,就是我们需要自己,哎,那最后特别是这个message需要自己定义,Message需要自己定义,自己构造一个自己构造的时候呢,我们就可以来指定上我们这个,我们来看一下这个message,我们要发的这个消息内容,这个message呢,我们用AMQP这个核心包里边,你要把你要发的消息,哎,你序列化成这个字节数组,还有呢,你的消息的头信息,你可以带在message properties里边,然后呢,可以自己构造一个可以定制消息体内容。
07:34
好消息头好,这是我们这个limit send,那么我们简单常用的呢,是这个limit有一个叫convert and send,也就是呢,转化并发送,我们呢,只需要写上我们的这个交换器,还有路由件,还有我们这个要发送的数据对象,这个对象呢,默认就会被当成消息体,而且呢,它会自动转化。
08:05
哎,我们只需要,只需只需要传递要发送的对象。只需要入要发送到咱们这个对象,然后呢,我们自动序列化,序列化,然后呢,保存发送给让MQ。软贝MQ,而这个object呢,它是被当成消息体的啊,默认当成咱们这个消息题,哎,如果不牵扯到我们复杂的,你要自定义一些请消息头,我们就可以用这个方法,好我呢就来直接使用下面这个方法,我们来测试一下点convert and send,如果我们要发点对点消息,那我们就要啊,按照我们这个交换器的规则,只有这个direct呢,能将我们这个直接派发给一个队列,好我们就连上这个交换器,我们把消息发给exchange点。
09:04
Exchange their direct。好,我们连上这个叫交换器,路由件呢,我们来写,写什么呢,来看这个交换器呢,我们之前呢,绑定了很多的路由件,由at特硅谷,如果路由键是他交给这个队列,路由键是它交给这个队列,那我们就来用at硅谷点news。好,我们用at google.news我们用这个啊邮件,然后呢,要发送的内容是什么?哎,比如呢,我们就随便写一个map,哎,我可以写一个map string object,我想存一些数据放进去,你有一个哈西map。我们给map里边呢,存一些数据放进去,哎,比如呢,Message一些提示消息。好,这是第一个消息。好,包括呢,我们还可以放一些比如map点哎put啊,我们这个data来放一些数据,数据呢我用a race。
10:11
啊,瑞点安list,我来转一个list数据放进去,有字符串,Hello word,还有我们数字123,还有true false,哎等等等等,我们都可以放在这,好,我把这个map呢,把它叫过来,这是哎我们要发的数据,我们来这么来写,这么来写,以后呢,我来发送测试一下,走,我看这个数据能不能到达。好。哎,这个呢,运行完成了,运行完成呢,我们来我们的消息队列来看一下,在这个队列里边我来刷新,哎,我们呢,刚才发的是at硅谷news这个消息,我来刷新看有没有接到好news呢,接到了这个消息,我们来点进来们来看一下这个news接到的消息,诶消息呢是这个样子,怎么是这个样子呢,这是由于我们序列化,它默认是用Java的这个序列化方式来给我们序列化的这个对象编码以后的样子,好,所以说呢,这个我们消息已经发到了,哎,咱们这个对象。
11:22
对象被默认,序列化被默认啊序列化以后发送出去,好这时我们发送这个点对点消息,那我们要接收到这个消息怎么办呢?我们可以用这个API public,好那比如叫receive。好,我们来接收消息,来写一个at test。我们同样用咱们这个rabbit table编码的方式呢,我们可以用它,那有这个receive方法,我们可以接收,包括呢,还有receive and convert,我们接收并转化,好我们呢,如果用这个接收,你说你说来自于哪个消息队列的消息,会把这个消息呢给你转成message,这个message里边既有消息头,也有消息体,那么如果用receive and convert可以直接呢,把我们这个消息体转换成我们想要的对象,好那用这个,那我们最终的数据都是发到了at硅谷点news,我们来看啊,是发到了at硅谷点news这个里边了,所以说呢,我们要收数据,我们也是收这个消息队列的,好,我们在这儿呢,写上消息队列的名称,然后呢,我来把它的这个收过来的数据拿过来,拿过来以后呢,我来先打印一下你这个数据的类型是什么。
12:50
再来打印一下我们收到的数据是什么?C是O,我们来看一下走。
13:08
好,我们发现呢,数据我们收到类型是哈希曼普,拿到这些数据没什么问题,诶,所以说呢,我们能也能准确的收到这个数据,但这个数据收到了以后,我们来看这个消息队列里边还有没有呢?哎,那么这个消息队列就没有了,哎,我们来再来刷新一下,哎,确实呢,就没有了,我们刚才已经收到,这就是呢,我们来接收数据。只不过呢,我们说有时候我想把这个对象呢,我要序列化成杰森的方式让你发出去,哎,这种序列化呢,刚才我们看那种啊,直接序列化编码后的结果啊,有点不好看,那如何将数据自动的转为接字发送出去,其实呢,非常简单,我们来到rabbit table里边,我们来看为什么刚才是那种序列化结果就是原因,我们来往下翻,原因呢,有一个叫消息转换器,这个转换器呢,默认它用的是叫simple message convert来点过来,这个message convert呢,它来序列化数据的时候,哎,就是按照JDK的那些序列化规则,哎,下边呢,这都写了,用咱们这个序列化工具,哎啊利用一个字节数组将我们这个数据信息拿到来,这么来序列化,好,我们呢,可以给它换一个message convert这个message convert呢,类型是我们。
14:34
Amp support convert怎么换呢?我们来写上配置,写上我们自己的配置。比如呢,你在con包写写一个MYAQP的con。这个confi呢,来写上一个configuration configuration,那我们呢,就自己来放一个这个message convert,注意导入am q support这个啊,这是我们的message convert,好,我们来先来return呢,来放哪个message convert呢?我们就来看它有哪些点进来CTRLH。
15:16
我们看呢,它有默认这么些的message convert,我们用哪个呢?我们就来用这个抽象的message convert里边,哎,有跟杰son有关的,有Jackson to,杰son message convert,所以说呢,我们给给他换成你有一个Jackson to,杰son message convert,我们换成他,换成它以后呢,哎,我们这个自动配置也会生效,来给大家看一下,在我们的rabbit自动配置里边,当我们来配置rabbit template的时候,哎,如果我们有自己定义的message convert,它呢也会在这给我们设置进来,好,这个message convert呢,我们这已经加上了,我再来测试这个消息发送。来,把消息发出去走。
16:03
来看队列里边的这些消息,还是不是原来序列化的结果,我们来刷新一下这个队列来刷新。再来刷新一下。哎,这个消息呢,已经发出去了,这个队列呢们来刷新一下,好,这块呢有内容来点进来,我们来获取内容,哎,我们现在呢,看到这个消息就是我们杰森数据,而且呢,还有定义的一些消息头,消息头有我们这个key的类型,我们这个整个消息内容的类型,哎,Application,杰森还有编码的类型等等,这个数据呢,我们就已经序列化过来了,那序列化能过去存起来,那么能不能取出消息反序列化过来呢?我们在这儿再来取一下测试走。哎,我们看到呢,这一块也是没问题的,能反序列化过来,而且这个类型变成了我们这个哈西map,那我们现在可不可以用我们自定义的一类一些类型,比如我我来发送存取一些book可对象啦等等,好,我来写一个book可对象,Book可对象,比如我来写一个private book里边,哎,有咱们这个book name,有书名,还有private string,我们这个作者author,好,我们就来写上两个属性,我们呢把它的get set方法我们都来加上。
17:31
然后呢,把它们有参无参构造器,哎,我也来加上,哎,我们来用一个。构造器,构造器呢,我们把两个参数的构造器加上,把无参构造器也一定加上。好。这个我们接下来发消息的时候呢,我来发一个图书对象,比如我来new一个book。用一个book new book的时候呢,哎,我们来给它传两个参数书名,比如我们传一个西游记。
18:05
作者呢,来传一个五成。好,我把这个信息呢,在这发送一下走。哎,我们看到呢,消息发送出去了,我在这个消息队列里边呢,来刷新一下,好有这个消息我们来点过来,来获取一下这个队列里边,诶book西游记书名无成这个,哎,我们都有,还有咱们这个类型的ID,它也记录了,叫这个book,那能不能反序列化获取出来呢?你在这测试还是它找。我们先用object对象来接收。好,虽然我们用object接收,但是我们看到,诶,这个class它打印的是book,可对象没问题,能拿到,要是强转,那在这呢也可以放心强转,这就是呢,我们消息序列化与反序列化机制,我们自己可以定义一个message convert,当然我们测试的这是一个单博,那如果想广播呢,那就更简单了,不管是单播还是广播,哎,我们发给对应的exchange交换器就行了。好,我们再来测试一下send message,那们还用这个第2CONVERT and send转化并发送消息,广播呢,我们就发给我们这个消息队列里边,我们定义了一个exchange final啊,这个是一个广播类型的交换器,然后呢,这个路由件就不用写了啊,因为广播是不用管路由件的,那我来用一个book book呢,比如我们来写上三国演义。
19:54
好,还有这个作者罗贯中,好,我们来写上,写上以后呢,我们来测试一下这个广播行不行,At test,好,那在这呢,来测试一下。
20:08
首先来看呢,这一块默认呢,我清空为都是零了,现在我们来看一下。这个测试发送好,现在呢,发出来了,我来刷新一下,刷新啊,我们稍等刷新。这一块呢,有点延迟啊,那现在呢,发现他们都收到了一个消息,诶那我们要获取呢,我们随便来看上一个and特硅谷EPS或许诶这就是三国演义罗贯中这里边有包括呢啊按个呃,咱们这个emps这里边呢也有啊,都是一样的消息,这呢是我们广播模式,那其他模式呢,只要我们把这个消息路由规则绑定好,那给对应的交换器来发送消息就行了,我们不需要过多的编码。
我来说两句