RabbitMQ 程式碼示例

HuDu發表於2021-05-21

Web 管理頁面

RabbitMQ

通過程式碼 debug 來對 Web 管理頁面有個更直觀的認識
生產者程式碼如下

public class Producer {
    public static void main(String[] args) {
        // 所有的中介軟體技術都是基於 TCP/IP 協議基礎之上構建的協議規範,只不過 rabbitmq 遵循的是 AMQP 協議
        // ip port
        // 1 建立連線工廠
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.33.180");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("szy10086");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            // 2 建立連線 Connection
            connection = connectionFactory.newConnection("生產者");
            // 3 通過連線獲取通道 Channel
            channel = connection.createChannel();
            // 4 通過建立交換機,宣告佇列,繫結關係,路由 key,傳送訊息和接收訊息
            String queueName = "queue1";
            /*
             * 佇列名字
             * 是否具有持久化 durable=false 所謂持久化訊息是否存檔,如果是false 非持久化 true 持久化?非持久化會存檔麼,會存檔,但是會隨著伺服器的重啟丟失
             * 排他性,是否具有獨立執行緒
             * 是否自動刪除,隨著最後一個消費者訊息消費完畢之後,是否把佇列自動刪除
             * 攜帶一些附屬引數
             */
            channel.queueDeclare(queueName,false,false,false,null);
            // 5 準備訊息內容
            String message = "hello,world";
            // 6 傳送訊息給佇列 queue
            // 交換機,佇列、路由key,訊息是否持久化,訊息內容主體
            channel.basicPublish("",queueName,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();
                }
            }
        }
    }
}

當程式碼執行到建立連線 Connection 時,可以在 Connections 一欄看到連線資訊。

RabbitMQ

當程式碼執行到建立通道時,看到 Channels 一欄資訊

RabbitMQ

當程式碼執行到佇列時候,看到 queues 一欄的資訊
RabbitMQ

執行結束之後可以看到佇列中的訊息增加了一個

RabbitMQ

消費著程式碼如下

public class Consumer {
    public static void main(String[] args) {
        // 所有的中介軟體技術都是基於 TCP/IP 協議基礎之上構建的協議規範,只不過 rabbitmq 遵循的是 AMQP 協議
        // ip port
        // 1 建立連線工廠
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.33.180");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("szy10086");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            // 2 建立連線 Connection
            connection = connectionFactory.newConnection("生產者");
            // 3 通過連線獲取通道 Channel
            channel = connection.createChannel();
            // 4 通過建立交換機,宣告佇列,繫結關係,路由 key,傳送訊息和接收訊息
            channel.basicConsume("queue1", true, new DeliverCallback() {
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println("收到訊息是:\t" + new String(delivery.getBody(), "UTF-8"));
                }
            }, new CancelCallback() {
                public void handle(String s) throws IOException {
                    System.out.println("接收失敗");
                }
            });

            System.out.println("開始接收訊息");
            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();
                }
            }
        }
    }
}

當程式碼執行到 System.in.read() 時,此時訊息都被消費了

RabbitMQ

當服務重啟後,訊息佇列消失。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章