1、參考文檔
2、重要概念
2.1 virtual hosts
虛擬主機,一個虛擬主機相當於一個獨立的空間,虛擬主機之間是相互隔離、互不影響的。
2.2 producer
生產者,投遞消息的一方
2.3 consumer
消費者,接收消息的一方
消費者定義
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
System.out.println("接收到消息:" + new String(body, "UTF-8"));
// 手動消息簽收
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
2.4 connection
連接,生產者或者消費者與rabbit服務器之間建立的長連接(默認端口是5672)
建立連接的過程如下
// 1.定義連接工廠
ConnectionFactory factory = new ConnectionFactory();
// 2.設置服務器地址
factory.setHost("127.0.0.1");
// 3.設置協議端口號
factory.setPort(5672);
// 4.設置vhost
factory.setVirtualHost("/test");
// 5.設置用戶名稱
factory.setUsername("test");
// 6.設置用戶密碼
factory.setPassword("test");
// 7.創建新的連接
Connection connection = factory.newConnection();
2.5 channel
通道,主要用於投遞消息和接收消息
常見api
// 創建通道
Channel channel = connection.createChannel();
// 創建隊列聲明
// 注意:第二個參數爲是否持久化,true:持久化,false:不持久化。持久化的隊列數據,會存到硬盤上,在rabbitmq重啓或者宕機後,還會保留。
channel.queueDeclare("queue", false, false, false, null);
// 交換機與隊列綁定
channel.queueBind("queue", "exchange", "routingKey");
// 綁定交換機
// 注意:第二個參數爲交換機類型,【direct,fanout,topic,headers】
channel.exchangeDeclare("exchange", "fanout");
// 發送消息
channel.basicPublish("exchange", "routingKey", null, "msg".getBytes());
// 消息流量控制
channel.basicQos(1);
// 綁定消費者
// 注意:第二個參數false:表示需要手動簽收消息;如果爲true,自動簽收消息
channel.basicConsume(queue, false, consumer);
// 手動簽收消息
channel.basicAck(envelope.getDeliveryTag(), false);
2.6 exchange
交換器,指定消息路由規則,發送到哪個隊列
交換機種類
- direct:簡單隊列與工作隊列使用此交換機類型
可以不綁定交換機,使用默認的交換機即可,把消息路由到那些RouteKey與queue名字完全一致的Queue中。
- fanout:發佈訂閱用的此類型交換機
不處理RouteKey ,綁定【fanout】類型交換機,把所有發送到fanout Exchange的消息都轉發到與該Exchange 綁定(Binding)的所有Queue上
- topic:主題模式
綁定【topic】類型交換機,會根據RouteKey匹配規則來轉發消息到對應的隊列中
RouteKey主要有兩個通配符:*,匹配一個單詞;#,匹配一個到多個單詞
- headers
根據發送的消息內容中的headers屬性進行匹配。未實際測試
2.7 queue
隊列,交換器接收到消息後,會根據路由規則,投遞到一個或者多個隊列中;如果按路由策略找不到對應的隊列,消息會被丟棄。
2.8 bindding
綁定關係,綁定交換機、隊列,並設置路由策略。