RabbitMQ從零開始學(五)通信模型之路由模型(direct)

路由模型(direct)

路由模式相當於是分佈訂閱模式的升級版,多了一個 路由key來約束隊列與交換機的綁定

在這裏插入圖片描述

編寫生產者

// 生產者
public class Producer {
    private static final String EXCHANGE_NAME = "exchange_direct_1";
    // 定義路由的key,key值是可以隨意定義的
    private static final String EXCHANGE_ROUTING_KEY1 = "direct_km1";
    private static final String EXCHANGE_ROUTING_KEY2 = "direct_km2";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1, null, ("路由模型發送的第 " + i + " 條信息").getBytes());
            } else {
                channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2, null, ("路由模型發送的第 " + i + " 條信息").getBytes());
            }
        }
        channel.close();
        connection.close();
    }
}

編寫消費者1

// 消費者1
public class Consumer {
    private static final String QUEUE_NAME = "queue_direct_1";
    private static final String EXCHANGE_NAME = "exchange_direct_1";
    private static final String EXCHANGE_ROUTING_KEY1 = "direct_km1";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消費者1接收到的消息是:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
    }
}

編寫消費者2

// 消費者2
public class Consumer2 {
    private static final String QUEUE_NAME = "queue_direct_2";
    private static final String EXCHANGE_NAME = "exchange_direct_1";
    private static final String EXCHANGE_ROUTING_KEY2 = "direct_km2";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消費者2接收到的消息是:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
    }
}

測試

先啓動2個消費者,再啓動生產者

運行結果
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

小結

這裏用到的方法和發佈訂閱模式使用的是一致的,方法參數詳情參照:RabbitMQ從零開始學(四)—通信模型之發佈訂閱模型—channel.exchangeDeclare()—channel.queueBind()

routingKey(路由key)是可以隨意設置的,我們可以按照設置的key,來指定交換機和隊列的綁定

RabbitMQ通訊模型系列

RabbitMQ從零開始學(二)—通信模型之HelloWorld型—channel方法參數詳解
RabbitMQ從零開始學(三)—通信模型之Work型—channel.basicQos()
RabbitMQ從零開始學(四)—通信模型之發佈訂閱模型—channel.exchangeDeclare()—channel.queueBind()
RabbitMQ從零開始學(六)—通信模型之topic模型—通信模型總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章