目錄:
- RabbitMQ幾大組件
- 交換器類型
- RabbitMQ運行流程
RabbitMQ幾大組件:(與RabbitMQ第一節中AMQP同樣,不細說)
一、生產者、消費者、消息函數
二、Broker:簡單的來講broker就是一個RabbitMQ的一個服務節點ui
三、隊列spa
四、交換器、路由鍵、綁定鍵code
交換器類型:
一、fanout(分列):把全部發送到該交換器上的消息,路由到與該交換器綁定的隊列中。blog
1 public class Product { 2 3 private static final String EXCHANGE_NAME = "exchange"; 4 private static final String QUEUE_NAME = "exchange_queue1"; 5 private static final String QUEUE_NAME2 = "exchange_queue2"; 6 private static final String ROUTING_KEY = "exchange_routingKey"; 7 private static final String ROUTING_KEY2 = "exchange_routingKey2"; 8 9 public static void main(String[] args) throws IOException, TimeoutException { 10 Connection connection = getConnection(); 11 Channel channel = connection.createChannel(); 12 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT); 13 14 // 定義隊列一、隊列2 15 channel.queueDeclare(QUEUE_NAME, false, false, false, null); 16 channel.queueDeclare(QUEUE_NAME2, false, false, false, null); 17 // 將隊列一、隊列2綁定到同一個fanout交換器上,但路由鍵不同 18 channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY); 19 channel.queueBind(QUEUE_NAME2, EXCHANGE_NAME, ROUTING_KEY2); 20 21 // 僅發送路由鍵1的消息,但因綁定鍵是fanout類型,因此隊列1和隊列2都會受到消息 22 channel.basicPublish(EXCHANGE_NAME, 23 ROUTING_KEY, 24 MessageProperties.PERSISTENT_TEXT_PLAIN, 25 "Hello world".getBytes()); 26 27 close(connection, channel); 28 } 29 }
二、direct(直接):須要bindingKey和routingKey徹底匹配才能成功發送消息。隊列
就fanout例子的第12行代碼修改成channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);(注意:修改代碼運行前,須要先將原先綁定的交換器刪掉,由於以前那個交換器已是fantou類型了;或者是定義一個新的交換器)路由
便只有exchange_queue1才能接受到消息,便爲2。get
三、topic(主題):與direct相似,但支持通配符匹配(相似於廣播)。回調函數
- #:匹配多個或零個單詞
- *:匹配一個單詞
四、header:不是根據路由鍵的匹配規則,而是經過發送消息中的header來匹配。it
RabbitMQ運行流程:
一、生產者:
- 生產者與Broker創建鏈接並開啓信道
- 生產者聲明交換器(交換器類型、是否持久化、是否自動刪除)、隊列(是否持久化、是否排他、是否自動刪除)
- 生產者經過路由鍵將交換器和隊列綁定
- 生產者發送消息到Broker(攜帶路由鍵等)
- 交換器再根據接收到的路由鍵以及交換器類型查找相匹配的隊列,若是匹配上了將消息存入隊列中,若未匹配上,則根據生產者的配置決定丟棄或是退回給生產者
- 關閉信道和鏈接
二、消費者:
- 消費者與Broker創建鏈接並開啓信道
- 消費者向Broker請求消費相對應的隊列,此中能夠設置回調函數
- 接受並處理消息
- 消費者能夠確認消息(ack)
- RabbitMQ從隊列中刪除已被確認的消息
- 關閉信道和鏈接