RabbitMQ 入門案例 - fanout 模式

HuDu發表於2021-05-21

釋出訂閱模式

圖解

RabbitMQ 入門案例 - fanout 模式

具體實現

  • 型別 fanout
  • 特點 Fanout-釋出訂閱模式,是一種廣播機制,它是沒有路由 key 的模式

生產者程式碼

public class Producer {
    public static void main(String[] args) {
        // 所有的中介軟體技術都是基於 TCP/IP 協議基礎之上構建的協議規範,只不過 rabbitmq 遵循的是 AMQP 協議
        // ip port
        // 1 建立連線工廠
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2 設定連線屬性
        connectionFactory.setHost("192.168.33.180");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("szy10086");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            // 3 從連線工廠中獲取連線 Connection
            connection = connectionFactory.newConnection("生產者");
            // 4 通過連線獲取通道 Channel
            channel = connection.createChannel();

            // 5 準備傳送訊息的內容
            String message = "This is a routing message";

            // 6 準備交換機
            String exchangeName = "fanout-exchange";
            // 7 定義路由 key
            String routingKey = "";
            // 8 指定交換機型別
            String type = "fanout";


            // 7 傳送訊息給佇列 queue
            /*
             * @param1:交換機名稱
             * @param2:佇列名稱/routingKey
             * @param3:屬性配置
             * @param4:傳送訊息的內容
             * #.course.* queue3...
             */
            channel.basicPublish(exchangeName,routingKey,null,message.getBytes());
            System.out.println("傳送訊息成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            // 7 關閉通道
            if (channel!= null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            // 8 關閉連線
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

消費者程式碼

public class Consumer {
    public static Runnable runnable = new Runnable() {
        public void run() {
            // 所有的中介軟體技術都是基於 TCP/IP 協議基礎之上構建的協議規範,只不過 rabbitmq 遵循的是 AMQP 協議
            // ip port
            // 1 建立連線工廠
            ConnectionFactory connectionFactory = new ConnectionFactory();
            // 2 設定連線屬性
            connectionFactory.setHost("192.168.33.180");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("admin");
            connectionFactory.setPassword("szy10086");
            connectionFactory.setVirtualHost("/");
            // 獲取佇列的名稱
            final String queueName = Thread.currentThread().getName();
            Connection connection = null;
            Channel channel = null;
            try {
                // 3 從連線工廠中獲取連線
                connection = connectionFactory.newConnection("生產者");
                // 4 通過連線獲取通道 Channel
                channel = connection.createChannel();
                // 5 宣告佇列 queue 儲存訊息
                /*
                 * 如果佇列不存在,則會建立
                 * RabbitMQ 不允許建立兩個相同的佇列名稱,否則會報錯
                 *
                 * @param1:queue 佇列的名稱
                 * @param2:durable 佇列是否持久化
                 * @param3:exclusive 是否排他,即是否私有,如果為 true,會對當前佇列加鎖,其它通道不能訪問,並且連線自動關閉
                 * @param4:autoDelete 是否自動刪除,當最後一個消費者斷開連線之後是否自動刪除訊息
                 * @param5:arguments 可以設定佇列附加引數,設定佇列的有效期,訊息的最大長度,佇列的訊息生命週期等等。
                 */
                Channel finalChannel = channel;
                finalChannel.basicConsume(queueName, true, new DeliverCallback() {
                    public void handle(String s, Delivery delivery) throws IOException {
                        System.out.println(delivery.getEnvelope().getDeliveryTag());
                        System.out.println(queueName+":收到訊息是:\t" + new String(delivery.getBody(), "UTF-8"));
                    }
                }, new CancelCallback() {
                    public void handle(String s) throws IOException {
                        System.out.println("接收失敗");
                    }
                });

                System.out.println(queueName+":開始接收訊息");
//                System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            } finally {
                // 7 關閉通道
                if (channel!= null && channel.isOpen()) {
                    try {
                        channel.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (TimeoutException e) {
                        e.printStackTrace();
                    }
                }
                // 8 關閉連線
                if (connection != null && connection.isOpen()) {
                    try {
                        connection.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };
    public static void main(String[] args) {
        // 啟動三個執行緒去執行
        new Thread(runnable,"queue1").start();
        new Thread(runnable,"queue2").start();
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章