第一次接触rabbitmq,用过之后觉得有必要把自己经历的一些问题和解决问题的过程记录下来分享给小伙伴们
Spring AMQP 是基于 Spring 框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO的消息监听等,很大程度上方便了我们进行相关程序的开发。
Message消息是当前模型中操纵的基本单位,它由Producer产生,经过路由转发被Consumer所消费。它是生产者和消费者发送和处理的对象。消息头是由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
Exchange,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
Exchange包含4种类型:Direct, Topic, Fanout, Headers。不同的类型,他们如何处理绑定到队列方面的行为会有所不同。
3)Fanout类型:它只是将消息广播到所有绑定到它的队列中,而不考虑routing key的值。
4)Header类型: 它根据应用程序消息的特定属性进行匹配,这些消息可能在binding key中标记为可选或者必选。
Queue,队列,它代表了Message Consumer接收消息的地方,它用来保存消息直到发送给消费者。Queue有以下一些重要的属性。
1)持久性:如果启用,队列将会在消息协商器(Broker)重启前都有效。
2)自动删除:如果启用,那么队列将会在所有的消费者停止使用之后自动删除掉自身。
3)惰性:如果没有声明队列,那么在执行到使用的时候会导致异常,并不会主动声明。
4)排他性:如果启用,队列只能被声明它的消费者使用。
Binding绑定,生产者发送消息到Exchange,接收者从Queue接收消息,而绑定(Binging)是生产者和消费者消息传递的重要连接,它是连接生产者和消费者进行信息交流的关键。
简单来说,RabbitMQ就是一个消息代理机制。它的工作就是接收和转发消息。你可以把它当作是一个邮局:寄信人把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。其中:
Exchange: 就是顺丰和韵达。
routingkey: 就是邮件地址的概念.
queue: 就是邮箱接收软件,但是可以接收多个地址的邮件,通过bind实现。
producer: 消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
在安装的时候要注意几个点,不然很容易出现安装后,服务跑不起来或者跑起来却不能访问
3.安装Erlang会生成两个cookie文件:C:\Windows\.erlang.cookie 及 C:\用户\你的用户名\.erlang.cookie。检查两个文件内容是否一致,不一致用其中一个替换另一个即可。
作为异步消息服务,rabbitmq能够使应用解耦,降低系统复杂度,提供系统稳定性。在我们审批系统中,主要应用场景包括以下几个方面:
1、办件同步:自建系统对接,一窗式办理平台
2、事项变更、窗口配置变更之后通知智能化;
3、从权力库同步事项
4、单机版应用对接(单机版高拍仪,双屏跳转)
5、发送短信
我们在使用过程中经常会遇到消息已经发送成功了,但消费端却接收不到,这时我们可以通过进入rabbitmq的管控台页面进行排查,本地访问http://localhost:15672/
1)交换机exchange是否存在,代码段的交换机申明属性要和已存在的交换机属性一致
2)队列是否存在,代码段的队列申明属性要和已存在的队列属性一致
3)队列和交换机之间存在绑定,只有将消息发送到了持久化队列中,才能保证消息的不丢。其中,exchange和queue之间定义绑定的路由键Routing key为:【project.*.accept.*】,那生产端发送消息时设置的routing key则必须为和这个匹配
4)消费端代码没有正确绑定到队列,如图,如果consumers一栏中并无消费者信息,则需要重新审阅代码端监听队列的代码,如果存在多个消费者信息,则是其他地方的代码之前申明绑定了该队列。