一、写在前面的问题和解决办法
1、问题背景:
RabbitMQ,用websock推送消息失败
2、问题描述:
服务器错误:Whoops! Lost connection to ws://localhost:15674/ws
3、解决办法:
网上查了好久说,加上这个jackson-core的jar包。我加啦啊!没有用啊!
我还换了版本试了还是报这个错。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0</version>
</dependency>
后来发现是因为没有启用Web STOMP插件,我真是愚蠢的humanbeing~
在RabbitMQ服务器的sbin目录下
rabbitmq-plugins enable rabbitmq_web_stomp
然后就成功啦~
O_OO_OO_OO_OO_OO_OO_O详细的学习笔记O_OO_OO_OO_OO_OO_OO_O
二、RabbitMQ学习笔记
最近在学习消息队列,参考的书籍是《分布式消息中间件实践》和网课(叫啥消息队列高手课,等我后面确认下),作为一个笔记狂魔,每次学习我都产出大量的笔记,那也不是每篇笔记都分享的,写这篇是因为在学习RabbitMQ的时候遇到了好多的问题,一一解决后,整理出来解决的过程和办法,还有一些自己的理解和总结。
(一)RabbitMQ的简单介绍
在学习了几款MQ产品以后,RabbitMQ给我的感觉就是,有点特别,与众不同。
(1)消息队列的模式
一般来说,消息队列有两种模式,一种是队列模式(点对点),一种是发布/订阅模式,
两个最大的区别就在于,一份消息能不能被消费多次的问题。
如果发布/订阅模式的订阅者只有一个,那就跟队列模式一样了。所以,发布/订阅模式是兼容队列模式的。
为啥好端端要说这个模式呢?
因为大多数消息队列都是发布/订阅模式,而RabbitMQ它却是为数不多的队列模式。
那它是不是就不能实现一份消息被消费多次啦?
那也不是的,它虽然是队列模式,但是它有个special的路由功能,也可以实现消息被消费多次的功能。
(2)
RabbitMQ是基于Erlang语言的,这个语言十分的小众,而且比较难懂。
对于学Java这些语言的我们来说,就像母语是英语的人去学汉语一样,比较难。
所以如果有啥问题可能不太好改。
(3)RabbitMQ是AMQP协议的一个开源实现。
这个AMQP是消息协议的一种,用我新买的ipad pro加二代pencil画了一下这个协议的图(我照着书上画的,嘻嘻)。
这个Exchange是消息处理中心Broker里的。
就是一个路由规则的含义,里面有Routing Key和Queue的映射关系。
我感觉这个Exchange就像是一个快递员,收到了生产者Publisher传过来的消息,就去查一下自己的规则表,看看这个消息发给哪个Queue。
如果找不到对应的Queue,就把消息扔回去给生产者,或者直接丢掉(直接丢掉就是一个很坏的快递员,哼╭(╯^╰)╮)
我又感觉这个Queue就像不同的菜鸟驿站的站点,嘻嘻。
如果消费者订阅了消息队列,消息队列收到消息就会尝试将消息传递给消费者,如果传递不成功,就把消息先存下来,等消费者来拿。(是不是真的很像菜鸟驿站)
然后我又感觉这个Exchange是个法师,如果看到一条消息对应了多个队列的话,它就会把这条消息复制成多个一毛一样的消息,发给不同的队列。(发现一个快递有好多人需要,就复刻了好多一模一样的)
哎呀,越写越多,想写的还没写呢。
(二)环境搭建
1、Erlang和RabbitMQ服务器
前面不是说啦RabbitMQ是基于Erlang语言的,所以要把RabbitMQ服务器启起来,还得下个Erlang。
需要注意的是,RabbitMQ和Erlang的版本要对应起来的,还不可以瞎下一个。
RabbitMQ和Erlang版本对应网站
我选啦RabbitMQ 3.8.4 和Erlang 22.3
资源我也上传啦!没分的找我一下,我再分享百度云盘,这会儿有点懒。
安装了以后,要用的命令都在这个sbin里面,启动RabbitMQ服务器
到sbin目录下,执行命令
rabbitmq-server
然后在chrome浏览器输
http://localhost:15672/
然后有这个页面嘞
账号和密码都默认是guest.登录进去就是酱紫~
哇,虽然还没有做啥,只是顺利的跑出来这个页面,也是很开心呀~
(三)基于RabbitMQ的消息推送
其实上面写了辣么多,还没写到我真的想写的。
前面我也说啦,是学习的《分布式消息中间件实践》这本书。前面几个简单的例子,我就不写啦,对着书写一遍完全没得问题。
想写的是这个WebSocket通信的这节例子,啊,跑起来真的艰难,我一定要记录一下。
实现的功能我简单介绍一下,就是一个服务端,一个客户端网页,然后服务端向RabbitMQ推送一条消息的时候