【MQ】RabbitMQ 交換機案例代碼

RabbitMQ Exchange類型:

  1. Direct交換機:完全按照Key進行投遞
  2. Topic交換機:對Key進行模式匹配後進行投遞: *匹配一個詞,#匹配一個或多個詞
  3. Fanout交換機:不需要key,通過廣播模式,將消息投遞到該交換機綁定的所有隊列
  4. 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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章