參看連接:java
springboot(八):RabbitMQ詳解--Author@純潔的微笑spring
隊列服務有三個概念: 發消息者、隊列、收消息者。springboot
比較重要的概念有 4 個:虛擬主機,交換機,隊列和綁定。bash
交換機的功能主要是接收消息而且轉發到綁定的隊列,交換機不存儲消息,在啓用ack模式後,交換機找不到隊列會返回錯誤。交換機有四種類型:Direct, topic, Headers and Fanout服務器
Direct Exchange是RabbitMQ默認的交換機模式,也是最簡單的模式,根據key全文匹配去尋找隊列。app
第一個 X - Q1 就有一個 binding key,名字爲 orange; X - Q2 就有 2 個 binding key,名字爲 black 和 green。當消息中的 路由鍵 和 這個 binding key 對應上的時候,那麼就知道了該消息去到哪個隊列中。 spring-boot
Topic Exchange 轉發消息主要是根據通配符。 在這種交換機下,隊列和交換機的綁定會定義一種路由模式,那麼,通配符就要在這種路由模式和路由鍵之間匹配後交換機才能轉發消息。 在這種交換機模式下:測試
具體代碼發送的時候仍是同樣,第一個參數表示交換機,第二個參數表示routing key,第三個參數即消息。以下:this
rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is RabbitMQ!");
topic 和 direct 相似, 只是匹配上支持了"模式", 在"點分"的 routing_key 形式中, 可使用兩個通配符:spa
headers 也是根據規則匹配, 相較於 direct 和 topic 固定地使用 routing_key , headers 則是一個自定義匹配規則的類型. 在隊列與交換器綁定時, 會設定一組鍵值對規則, 消息中也包括一組鍵值對( headers 屬性), 當這些鍵值對有一對, 或所有匹配時, 消息被投送到對應隊列.
Fanout Exchange 消息廣播的模式,無論路由鍵或者是路由模式,會把消息發給綁定給它的所有隊列,若是配置了routing_key會被忽略。
經過start.spring.io生成含有spring-boot-starter-amqp依賴的項目,結構以下:
application.properties
spring.application.name=DdoubleRabbit debug=true spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=ddouble spring.rabbitmq.password=Tong2014
RabbitConfig.java
package com.ddouble.DdoubleRabbit.rabbit; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitConfig { @Bean public Queue helloQueue() { return new Queue("hello"); } }
HelloSender.java
package com.ddouble.DdoubleRabbit.rabbit.hello; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; @Component public class HelloSender { @Autowired private AmqpTemplate rabbitTemplate; public void send() { String context = "hello" + new Date(); System.out.println("Sender : " + context); this.rabbitTemplate.convertAndSend("hello", context); } }
HelloReceiver.java
package com.ddouble.DdoubleRabbit.rabbit.hello; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @RabbitListener(queues = "hello") public class HelloReceiver { @RabbitHandler public void process(String str) { System.out.println("Receiver : " + str); } }
測試類
package com.ddouble.DdoubleRabbit; import com.ddouble.DdoubleRabbit.rabbit.hello.HelloSender; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class DdoubleRabbitApplicationTests { @Autowired private HelloSender helloSender; @Test public void contextLoads() { helloSender.send(); } }
控制檯打印:
RabbitMQ能夠看到一個「hello」的Queue