RabbitMQ Exchange類型:
- Direct交換機:完全按照Key進行投遞
- Topic交換機:對Key進行模式匹配後進行投遞: *匹配一個詞,#匹配一個或多個詞
- Fanout交換機:不需要key,通過廣播模式,將消息投遞到該交換機綁定的所有隊列
- Headers交換機: 根據消息頭部決定隊列消息分發
1. Direct Exchange: 默認交換機
/**
* Direct 交換機:完全按照RouteKey進行消息投遞(默認交換機)
* @author zhiwei_yang
* @time 2020-8-4-9:45
*/
@Slf4j
public class DirectExchange {
private final static String QUEUE_NAME = "DIRECT_EXCHANGE_QUEUE";
private final static String ROUTE_KEY = QUEUE_NAME;
private final static String EXCHANGE_NAME = "DirectExchange";
public static void main(String[] argv) throws Exception {
//創建連接內部的通道,用於發送和接收信息
Channel channel = RabbitMqUtil.getChannel();
//聲明並創建DIRECT交換器:MsgExchange
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, false);
//聲明並創建消息隊列:MsgQueue
// durable: 是否持久化隊列
// exclusive: 排他隊列:排他性隊列,只對當前連接可見,鏈接斷開自動刪除
// autoDelete: 隊列不再使用會自動刪除
// arguments: 其他隊列創建參數
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//綁定交換器和消息隊列
// routing key:exchange將接收消息routing key="MsgQueue",轉發到綁定的消息隊列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTE_KEY);
String message = "Hello Direct Exchange World!";
channel.basicPublish(EXCHANGE_NAME, ROUTE_KEY, null, message.getBytes(StandardCharsets.UTF_8));
log.info(" [x] Sent '" + message + "'");
channel.close();
channel.getConnection().close();
}
}
2. Topic Exchange: 主題交換機,路由鍵模式匹配
/**
* Topic 交換機: 按照Key匹配模式進行消息投遞
* @author zhiwei_yang
* @time 2020-8-4-9:45
*/
@Slf4j
public class TopicExchange {
private final static String QUEUE_NAME = "topic.exchange.queue";
//*匹配一個詞,#匹配一個或多個詞, 自定義路由健單詞用‘.’區分
private final static String ROUTE_KEY_ONE = "topic.exchange.*";
private final static String ROUTE_KEY_TWO = "topic.exchange.#";
private final static String EXCHANGE_NAME = "TopicExchange";
public static void main(String[] argv) throws Exception {
Channel channel = RabbitMqUtil.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC, false);
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// Topic 交換機: 按照路由鍵模式匹配
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTE_KEY_ONE);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTE_KEY_TWO);
String message = "Single Word Match ===> Hello Topic Exchange World!";
// 自定義路由鍵:topic.exchange.hello, 匹配Topic交換機路由鍵模式topic.exchange.*,會自動投遞到指定主題:topic.exchange.queue
channel.basicPublish(EXCHANGE_NAME, "topic.exchange.hello", null, message.getBytes(StandardCharsets.UTF_8));
log.info(" [x] Sent '" + message + "'");
// 多個單詞模式匹配
message = "Multi Word Match ===> Hello Topic Exchange World!";
channel.basicPublish(EXCHANGE_NAME, "topic.exchange.hello.world", null, message.getBytes(StandardCharsets.UTF_8));
log.info(" [x] Sent '" + message + "'");
channel.close();
channel.getConnection().close();
}
}
3. Fanout Exchange: 類似消息廣播分發,不區分路由鍵
/**
* Fanout 交換機:無需Key直接投遞到Fanout綁定的所有消息隊列,類似廣播模式
* @author zhiwei_yang
* @time 2020-8-4-9:45
*/
@Slf4j
public class FanoutExchange {
private final static String QUEUE_NAME_ONE = "fanout.exchange.queue.one";
private final static String QUEUE_NAME_TWO = "fanout.exchange.queue.two";
private final static String EXCHANGE_NAME = "FanoutExchange";
public static void main(String[] argv) throws Exception {
Channel channel = RabbitMqUtil.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT, false);
channel.queueDeclare(QUEUE_NAME_ONE, false, false, false, null);
channel.queueDeclare(QUEUE_NAME_TWO, false, false, false, null);
// Fanout 交換機,直接投遞到所有綁定的消息隊列
channel.queueBind(QUEUE_NAME_ONE, EXCHANGE_NAME, "");
channel.queueBind(QUEUE_NAME_TWO, EXCHANGE_NAME, "");
String message = "Hello Fanout Exchange World!";
//Fanout: 交換機無需路由鍵
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes(StandardCharsets.UTF_8));
log.info(" [x] Sent '" + message + "'");
channel.close();
channel.getConnection().close();
}
}
4. Headers Exchange: 根據消息頭進行消息路由分發
/**
* Headers 交換機:根據頭部數據決定消息路由分發
* @author zhiwei_yang
* @time 2020-8-4-9:45
*/
@Slf4j
public class HeadersExchange {
private final static String QUEUE_NAME_ONE = "headers.exchange.queue.one";
private final static String QUEUE_NAME_TWO = "headers.exchange.queue.two";
private final static String EXCHANGE_NAME = "HeadersExchange";
public static void main(String[] argv) throws Exception {
Channel channel = RabbitMqUtil.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS, false);
channel.queueDeclare(QUEUE_NAME_ONE, false, false, false, null);
channel.queueDeclare(QUEUE_NAME_TWO, false, false, false, null);
Map<String,Object> headerOne = new HashMap<>(1);
headerOne.put("topic-one", "email");
channel.queueBind(QUEUE_NAME_ONE, EXCHANGE_NAME, "", headerOne);
Map<String,Object> headerTwo = new HashMap<>(1);
headerTwo.put("topic-two", "message");
channel.queueBind(QUEUE_NAME_TWO, EXCHANGE_NAME, "", headerTwo);
String message = "Hello Headers Exchange World!";
// 消息隊列headers.exchange.queue.one 投遞
AMQP.BasicProperties propertiesOne = new AMQP.BasicProperties.Builder().headers(headerOne).build();
channel.basicPublish(EXCHANGE_NAME, "", propertiesOne, message.getBytes(StandardCharsets.UTF_8));
log.info(" [x] Sent '" + message + "'");
// 消息隊列headers.exchange.queue.two 投遞
AMQP.BasicProperties propertiesTwo = new AMQP.BasicProperties.Builder().headers(headerTwo).build();
channel.basicPublish(EXCHANGE_NAME, "", propertiesTwo, message.getBytes(StandardCharsets.UTF_8));
log.info(" [x] Sent '" + message + "'");
channel.getConnection().close();
}
}