RabbitMQ六種佇列模式-路由模式
本文帶大家瞭解 RabbitMQ 佇列模式中的路由模式。
其實只要看過上篇釋出模式後,相信路由模式上手就非常 easy 了,唯一差距就是兩個引數,exchange型別和 routingKey 。
1、什麼是路由模式
路由模式跟釋出訂閱模式類似,然後在訂閱模式的基礎上加上了型別,訂閱模式是分發到所有繫結到交換機的佇列,路由模式只分發到繫結在交換機上面指定路由鍵的佇列,我們可以看一下下面這張圖:
P 表示為生產者、 X 表示交換機、C1C2 表示為消費者,紅色表示佇列。
上圖是一個結合日誌消費級別的配圖,在路由模式它會把訊息路由到那些 binding key 與 routing key 完全匹配的 Queue 中,此模式也就是 Exchange 模式中的 direct 模式。
以上圖的配置為例,我們以 routingKey="error" 傳送訊息到 Exchange,則訊息會路由到Queue1(amqp.gen-S9b…,這是由RabbitMQ自動生成的Queue名稱)和Queue2(amqp.gen-Agl…)。如果我們以 routingKey="info" 或 routingKey="warning" 來傳送訊息,則訊息只會路由到 Queue2。如果我們以其他 routingKey 傳送訊息,則訊息不會路由到這兩個 Queue 中。
相對於釋出訂閱模式,我們可以看到不再是廣播似的接收全部訊息,而是有選擇性的消費。
2、程式碼部分
2.1 日誌生產者
package com.shuofeng.producer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.shuofeng.common.MQConnectionUtils;
public class ProdecerRouting {
private static final String EXCHANGE_NAME = "my_fanout_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立新的連線
Connection newConnection = MQConnectionUtils.newConnection();
//2.建立通道
Channel channel = newConnection.createChannel();
//3.繫結交換機 引數一為交換機名字 引數二為分發型別
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//4.傳送訊息
String message = "",sendType="";
for(int i = 0;i < 10;i++) {
if(i%2==0){
sendType = "info";
message = "我是 info 級別的訊息型別:" + i;
}else{
sendType = "error";
message = "我是 error 級別的訊息型別:" + i;
}
System.out.println("[send]:" + message + " " +sendType);
channel.basicPublish(EXCHANGE_NAME, sendType, null, message.getBytes("UTF-8"));
try {
Thread.sleep(5 * i);
} catch (Exception e) {
e.printStackTrace();
}
}
//5.關閉通道
channel.close();
newConnection.close();
}
}
2.2 info消費者
package com.shuofeng.customer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.shuofeng.common.MQConnectionUtils;
public class ConsumerInfo {
private static final String QUEUE_NAME = "consumer_info";
private static final String EXCHANGE_NAME = "my_fanout_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立新的連線
Connection newConnection = MQConnectionUtils.newConnection();
//2.建立通道
Channel channel = newConnection.createChannel();
//3.消費者關聯佇列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//4.消費者繫結交換機 引數1 佇列 引數2交換機 引數3 routingKey
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "info");
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消費者獲取生產者訊息:" + msg);
}
};
//5.消費者監聽佇列訊息
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
2.3 error消費者
package com.shuofeng.customer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.shuofeng.common.MQConnectionUtils;
public class ConsumerError {
private static final String QUEUE_NAME = "consumer_error";
private static final String EXCHANGE_NAME = "my_fanout_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立新的連線
Connection newConnection = MQConnectionUtils.newConnection();
//2.建立通道
Channel channel = newConnection.createChannel();
//3.消費者關聯佇列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//4.消費者繫結交換機 引數1 佇列 引數2交換機 引數3 routingKey
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "error");
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消費者獲取生產者訊息:" + msg);
}
};
//5.消費者監聽佇列訊息
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
2.4 執行截圖
生產者
info消費者
error 消費者
3、路由模式總結
1、兩個佇列消費者設定的路由不一樣,接收到的訊息就不一樣。路由模式下,決定訊息向佇列推送的主要取決於路由,而不是交換機了。
2、該模式必須設定交換機,且宣告路由模式 channel.exchangeDeclare(EXCHANGE_NAME, "direct");
相關文章
- 【RabbitMQ】——佇列模式(2)MQ佇列模式
- RabbitMQ的佇列模式你真的懂嗎MQ佇列模式
- RabbitMQ-路由模式MQ路由模式
- RabbitMQ的工作佇列和路由MQ佇列路由
- 乾貨!基於SpringBoot的RabbitMQ多種模式佇列實戰Spring BootMQ模式佇列
- RabbitMQ訊息佇列(五):Routing 訊息路由MQ佇列路由
- 連RabbitMQ的5種核心訊息模式都不懂,也敢說自己會用訊息佇列!MQ模式佇列
- 4.RabbitMQ 4種交換模式MQ模式
- 訊息佇列-一篇讀懂rabbitmq(生命週期,confirm模式,延遲佇列,叢集)佇列MQ模式
- 帶你玩轉RabbitMQ的五種佇列MQ佇列
- C#使用RabbitMq佇列(Sample,Work,Fanout,Direct等模式的簡單使用)C#MQ佇列模式
- RabbitMQ 訊息佇列之佇列模型MQ佇列模型
- Laravel RabbitMQ 工作佇列LaravelMQ佇列
- RabbitMQ訊息佇列MQ佇列
- 延時佇列(RabbitMQ)佇列MQ
- [訊息佇列]RabbitMQ佇列MQ
- rabbitmq confirm機制路由不到佇列無法觸發handleNackMQ路由佇列
- 每日一學:你知道如何在 RabbitMQ 中實現 Work queues工作佇列模式嗎?MQ佇列模式
- RabbitMQ,RocketMQ,Kafka 幾種訊息佇列的對比MQKafka佇列
- MQ訊息佇列_RabbitMQMQ佇列
- RabbitMQ 高階 - 死信佇列MQ佇列
- RabbitMQ:偽延時佇列MQ佇列
- rabbitmq訊息佇列原理MQ佇列
- RabbitMQ-簡單佇列MQ佇列
- 訊息佇列之RabbitMQ佇列MQ
- lumen 8.0 使用 rabbitmq 佇列MQ佇列
- 訊息佇列之 RabbitMQ佇列MQ
- RabbitMQ 入門 - 工作佇列MQ佇列
- 佇列工廠之RabbitMQ佇列MQ
- RabbitMQ 訊息佇列 配置MQ佇列
- Springboot + rabbitMq佇列Spring BootMQ佇列
- 23種設計模式(六)-責任鏈設計模式設計模式
- java23種設計模式——六、介面卡模式Java設計模式
- RabbitMQ從零到叢集高可用(.NetCore5.0) - RabbitMQ簡介和六種工作模式詳解MQNetCore模式
- 單例模式的六種寫法單例模式
- 整理下java六種單例模式Java單例模式
- linux init六種執行模式Linux模式
- Spring Boot 揭祕與實戰(六) 訊息佇列篇 – RabbitMQSpring Boot佇列MQ