RabbitMQ實戰(一)

介紹

RabbitMQ 是一個消息代理:它接受並轉發消息。你可以將其視爲郵局:當你將要發佈的郵件放在郵箱中時,您可以確信 Postman 先生最終會將郵件發送給收件人。在這個比喻中,RabbitMQ 是一個郵箱,郵局和郵遞員。 RabbitMQ 和郵局之間的主要區別在於它不處理紙張,而是接受,存儲和轉發二進制數據塊的消息。
常見術語
RabbitMQ 使用一些術語:生產者、隊列、消費者。
生產者:一個發送消息的程序是一個生產者。
在這裏插入圖片描述
隊列:類似於郵箱。雖然消息通過 RabbitMQ 在你的應用中傳遞,但是它們只能存儲在隊列中。隊列只受主機的內存和磁盤限制的限制,它本質上是一個大的消息緩衝區。不同的生產者可以通過同一個隊列發送消息,此外,不同的消費者也可以從同一個隊列上接收消息。
在這裏插入圖片描述
消費者:一個等待接收消息的程序是一個消費者。
在這裏插入圖片描述
整個過程非常簡單,生產者創建消息,消費者接收這些消息。你的應用程序既可以作爲生產者向其他應用程序發送消息,也可以作爲消費者,等待接收其他應用程序的消息。其中,存儲消息的是消息隊列,它類似於郵箱,消息通過消息隊列進行投遞。

準備工作
在這裏插入圖片描述
我們會調用生產者發送消息給消費者。生產者連接到 RabbitMQ,發送一條數據,然後退出。
發送端

public class Send {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 創建連接
        ConnectionFactory factory = new ConnectionFactory();
        // 設置 RabbitMQ 的主機名
        factory.setHost("localhost");
        // 創建一個連接
        Connection connection = factory.newConnection();
        // 創建一個通道
        Channel channel = connection.createChannel();    
        // 指定一個隊列
        // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
        // 參數1 queue :隊列名
        // 參數2 durable :是否持久化
        // 參數3 exclusive :僅創建者可以使用的私有隊列,斷開後自動刪除
        // 參數4 autoDelete : 當所有消費客戶端連接斷開後,是否自動刪除隊列
        // 參數5 arguments
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 發送消息
        String message = "Hello World!";
        // basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
        // 參數1 exchange :交換器
        // 參數2 routingKey : 路由鍵
        // 參數3 props : 消息的其他參數
        // 參數4 body : 消息體
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        // 關閉頻道和連接  
        channel.close();
        connection.close();
    }
}

聲明隊列是冪等的, 隊列只會在它不存在時纔會被創建,多次聲明並不會重複創建。消息內容是一個字節數組,也就意味着可以傳遞任何數據。
接受端

public class Recv {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 創建連接
        ConnectionFactory factory = new ConnectionFactory();
        // 設置 RabbitMQ 的主機名
        factory.setHost("localhost");
        // 創建一個連接
        Connection connection = factory.newConnection();
        // 創建一個通道
        Channel channel = connection.createChannel();
        // 指定一個隊列
        // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
        // 參數1 queue :隊列名
        // 參數2 durable :是否持久化
        // 參數3 exclusive :僅創建者可以使用的私有隊列,斷開後自動刪除
        // 參數4 autoDelete : 當所有消費客戶端連接斷開後,是否自動刪除隊列
        // 參數5 arguments
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
        // 創建隊列消費者
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println(" [x] Received '" + message + "'");
            }
        };
        // basicConsume(String queue, boolean autoAck, Consumer callback)
        // 參數1 queue :隊列名
        // 參數2 autoAck : 是否自動ACK
        // 參數3 callback : 消費者對象的一個接口,用來配置回調
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章