- 本文主要整理一下與 RabbitMQ 相關的一些基本概念,瞭解這些概念,是使用好 RabbitMQ 的基礎;
- 並使用直連型交換機作了一個demo,經過實例去更好的理解這些概念。文末提供有 demo 下載地址。
備註:想對 AMQP 有深刻了解能夠點這裏查看。git
經過下面這張圖片,咱們能夠對 RabbitMQ 的模型有一個大概的瞭解:
github
須要瞭解的基本概念主要以下:web
test1
,則只會轉發轉發 test1,不會轉發 test2。Topic:模式匹配,Exchange 會把消息發送到一個或者多個知足通配符規則的 routing-key 的 Queue。spring
*
號表示匹配一個 word(好比:知足 a.*.c
的 routing-key 有 a.test1.c
);#
號匹配多個 word 和路徑,路徑之間經過 . 隔開(好比:知足 a.#.c
的 routing-key 有 a.test1.test2.c
);一會兒看到這麼多概念,可能會有點發懵。下面咱們經過一個很簡單的 demo 去深刻理解一下這些概念。
安全
建立一個 SpringBoot 項目,在 pom.xml
文件裏添加依賴:服務器
<!--mq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
# rabbitmq spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
添加一個 RabbitMQ 的配置類 RabbitConfig:微信
/** * RabbitMQ配置 * @公衆號 全棧在路上 * @GitHub https://github.com/liuyongfei1 * @author lyf * @date 2020-05-17 17:20 */ Configuration public class RabbitConfig { /** * 聲明隊列 * 參數說明: * durable 是否持久化,默認是false(持久化隊列則數據會被存儲在磁盤上,當消息代理重啓時數據不會丟失;暫存隊列只對當前鏈接有效) * exclusive 默認是false,只能被當前建立的鏈接使用,並且當鏈接關閉後隊列即被刪除。此參考優先級高於durable * autoDelete 默認是false,是否自動刪除,當沒有生產者或者消費者使用此隊列,該隊列會自動刪除。 * 通常設置一下隊列的持久化就好,其他兩個就是默認false * @return Queue */ @Bean Queue myQueue() { return new Queue(QueueConstants.QUEUE_NAME, true); } /** * 設置交換機,類型爲 direct * @return DirectExchange */ @Bean DirectExchange myExchange() { return new DirectExchange(QueueConstants.QUEUE_EXCHANGE_NAME, true, false); } /** * 綁定:將交換機和隊列綁定,並設置路由匹配鍵 * @return Binding */ @Bean Binding queueBinding() { return BindingBuilder.bind(myQueue()).to(myExchange()).with(QueueConstants.QUEUE_ROUTING_KEY_NAME); } }
/** * 消息生產端 * @公衆號 全棧在路上 * @GitHub https://github.com/liuyongfei1 * @author lyf * @date 2020-05-17 18:30 */ @RestController public class ProducerController { /** * RabbitTemplate提供了發送/接收消息的方法 */ @Autowired RabbitTemplate rabbitTemplate; /** * 發送消息(交換機類型爲 Direct) * @return */ @GetMapping("/sendDirectMessage") public String sendDirectMessage() { // 生成消息的惟一id String msgId = UUID.randomUUID().toString(); String messageData = "hello,this is rabbitmq demo message"; String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 定義要發送的消息對象 Map<String,Object> messageObj = new HashMap<>(); messageObj.put("msgId",msgId); messageObj.put("messageData",messageData); messageObj.put("createTime",createTime); rabbitTemplate.convertAndSend(QueueConstants.QUEUE_EXCHANGE_NAME,QueueConstants.QUEUE_ROUTING_KEY_NAME, messageObj); return "message send ok"; } }
代碼保存後,啓動服務,使用 Postman 請求生產消息接口:
app
Postman 請求成功,咱們打開 RabbitMQ 的管理界面:
dom
能夠看到有一個名爲 demo1_queue
的隊列,說明咱們測試的消息已經推送到RabbitMq 服務器上面了:spring-boot
Total 爲 1
Ready 爲 1
/** * 消息消費端 * @公衆號 全棧在路上 * @GitHub https://github.com/liuyongfei1 * @author lyf * @date 2020-05-17 18:00 */ @Component @RabbitListener(queues = {QueueConstants.QUEUE_NAME}) public class ConsumerController { @RabbitHandler public void handler(Map message) throws IOException { System.out.println("收到消息:" + message.toString()); } }
保存代碼,重啓服務,在 Idea 的終端窗口,能夠看到以前生產的那條消息已經被被消費了:
因爲當前隊列就 1 條消息 且已經被成功消費掉了,再次訪問 RabbitMQ 管理界面,會發現 Ready 和 Total 已經更新爲 0。