1.JMS&AMQPhtml
JMS(Java MessageService)其實是指JMS API。JMS是由Sun公司早期提出的消息標準,旨在爲java應用提供統一的消息操做,包括create、send、receive等。 JMS提供了兩種消息模型,peer-2-peer(點對點)以及publish-subscribe(發佈訂閱)模型。在JMS中,消息路由很是簡單,由producer和consumer連接到同一個queue(p2p)或者topic(pub/sub)來實現消息的路由。java
AMQP (高級消息隊列協議)AMQP是一種協議,更準確的說是一種binary wire-level protocol(連接協議)。這是其和JMS的本質差異,AMQP不從API層進行限定,而是直接定義網絡交換的數據格式。這使得實現了AMQP的provider自然性就是跨平臺的。在AMQP中增長了Exchange和binding的角色。producer將消息發送給Exchange,binding決定Exchange的消息應該發送到那個queue,而consumer直接從queue中消費消息。queue和exchange的bind有consumer來決定。spring
2.RabbitMQ基本概念(來自https://www.jianshu.com/p/79ca08116d57)docker
AMQP 中消息的路由過程和 Java 開發者熟悉的 JMS 存在一些差異,AMQP 中增長了 Exchange 和 Binding 的角色。生產者把消息發佈到 Exchange 上,消息最終到達隊列並被消費者接收,而 Binding 決定交換器的消息應該發送到那個隊列。json
Exchange分發消息時根據類型的不一樣分發策略有區別,目前共四種類型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由鍵,此外 headers 交換器和 direct 交換器徹底一致,但性能差不少,目前幾乎用不到了,因此直接看另外三種類型:服務器
(1).direct網絡
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
(2)配置rabbitmq,創建Exchange和Queen,Budingide
spring.rabbitmq.host=192.168.1.215 spring.rabbitmq.username=guest spring.rabbitmq.password=guest #也可不寫,默認5672 spring.rabbitmq.port=5672 #也可不配,默認爲/ spring.rabbitmq.virtual-host=/
Exchange和Queen,Buding 能夠經過管理後臺來實現,管理後臺的端口號默認爲15672,能夠創建Exchange 和 queen 以及經過routing key 在交換器和隊列之間創建路由規則。spring-boot
(3)自動配置性能
RabbitMQ的自動配置在org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration下面,自動配置了rabbitConnectionFactory建立鏈接,rabbitTemplate 提供模板操做,amqpAdmin 提供管理功能。rabbitmq的其餘相關配置可在全局配置文件中以spring.rabbitmq 來配置。
(4)發送消息
能夠直接注入RabbitTemplate,而後調用send 方法或者convertAndSend 方法發送消息,同時制定要發送的Exchange名稱, routing key 值,消息內容。
public void sendObject() { Employee emp = new Employee(1, "王小二", "dedwew@163.com", 1, 1); rabbitTemplate.convertAndSend("exchanges.direct","xxx",emp); }
(5)接收消息
public void receiveMsg() { Object msg = rabbitTemplate.receiveAndConvert("xxx"); System.out.println(msg); }
(6)帶有監聽事件的接收消息
@RabbitListener(queues= {"xxx"}) public void receive(Employee employee) { System.out.println(employee.toString()); }
(7)自定義json格式的消息轉換器
@Configuration public class AmqpMessageConvert { @Bean public MessageConverter messageConverter() { return new Jackson2JsonMessageConverter(); } }