亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

RabbitMQ 入門教程

RabbitMQ 簡介
RabbitMQ 簡介
首頁 慕課教程 RabbitMQ 入門教程 RabbitMQ 入門教程 消息發送模式實戰之普通隊列模式與工作隊列模式

消息發送模式實戰之普通隊列模式與工作隊列模式

1. 前言

Hello,大家好。在上述小節中,我們對 RabbitMQ 中的發布訂閱消息發送模式的實戰內容進行了介紹,并針對不同的業務場景進行了代碼實現。在本小節中,我們將對 RabbitMQ 中消息發送模式的最后兩種模式的實戰內容進行介紹。

本小節會介紹 RabbitMQ 中最后的兩種消息發送模式的實戰部分,包括普通隊列模式的基礎概念回顧與代碼實現,以及工作隊列模式的基礎概念回顧與代碼實現,在將這兩部分的實戰內容介紹完畢之后,RabbitMQ 中所有的消息發送模式中的實戰內容就全部介紹完畢了。

本節主要內容:

  • 普通隊列模式與工作隊列模式基礎概念回顧;

  • 普通隊列模式與工作隊列模式代碼實操。

2.普通隊列模式與工作隊列模式基礎概念回顧

在我們正式開始使用代碼進行實戰之前,讓我們先來回顧一下普通隊列模式與工作隊列模式的基礎概念等相關內容。

2.1 普通隊列模式基礎概念回顧

定義:

普通隊列模式,即最簡單的消息發送模式,不使用任何交換機,由生產者、隊列、消費者組合完成消息的發送和接收。

描述:

普通隊列模式,由于其操作簡單,所以又被稱為簡單模式,如下圖所示:

普通隊列模式,在生產者生產完消息之后,直接將消息發送到隊列中去,不經過交換機進行處理,然后由消費者直從消息隊列中獲取消息并消費。在這個過程中間,沒有我們需要特別注意的地方。

2.2 工作隊列模式基礎概念回顧

定義:

工作隊列模式,和普通隊列模式有點像,都是不使用任何交換機,由生產者、隊列、消費者組合完成消息的發送和接收,只不過工作隊列支持存在多個消費者,而普通隊列模式只支持一個消費者。

描述:

工作隊列模式下,生產者生產出消息后,直接將消息發送到消息隊列中,然后多個消費者按照一個隨機的順序來依次獲取消息并消費。

存在多個消費者消費消息時,下一個消費者只能等待上一個消費者消費結束后才能獲取到消息并進行消費。

這就提示我們,在實際工作中,我們可以把費時的業務操作交給 RabbitMQ 去做,這樣可以提升代碼的執行效率。

Tips:
1. 無論是普通隊列模式,還是工作隊列模式,其操作相對來說都比較簡單,適合很簡單的業務場景,同時,初學者更易于理解。
2. 工作隊列模式和發布訂閱模式的功能很相似,都是用于消息需要進行群發的場景,對于這兩種模式,我們在實際工作中應該仔細斟酌,到底使用哪種消息發送模式最合適。

3 普通隊列模式與工作隊列模式

3.1 普通隊列模式代碼實操

在回顧完普通隊列模式的基礎概念之后,讓我們來看一下如何使用代碼來實現這種普通隊列模式:

實現代碼:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.close();
connection.close();

代碼解釋:

第 1-5 行,我們使用了 RabbitMQ 的 ConnectionFactory 連接工廠,來初始化了一些獲取 RabbitMQ 連接的必要參數。

第 6 行,我們從 RabbitMQ 的連接工廠中,獲取到了一個 RabbitMQ Conneciton 連接實例。

第 7 行,我們通過 RabbitMQ 連接實例,創建了一個 channel 通道,為之后的消息通信提供媒介。

第 8 行,我們使用 channel 的 queueDeclare 方法,來聲明一個消息隊列,并綁定到我們的 channel 頻道上。

第 9-10 行,在處理完通道與連接實例之后,我們分別調用了 close 方法,將建立的通信連接和通道進行關閉,以節省資源開銷。

由于普通隊列模式不需要交換機的參與,只需要一個生產者、一個消費者,還有一個消息隊列,即可完成,這就是普通隊列模式。

3.2 工作隊列模式代碼實操

我們來看工作隊列模式的代碼實現:

實現代碼:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
Consumer consumer = new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,byte[] body) throws IOException {
        String msg = new String(body, "UTF-8");
        // 業務處理
    }
};
channel.basicConsume(QUEUE_NAME, true, consumer);
channel.close();
connection.close();

代碼解釋:

第 1-7 行,代碼和第一種業務場景相似,這里不再贅述。

第 8-16 行,我們通過使用 new DefaultConsumer 匿名內部類的形式,來依次從消息隊列中獲取消息,在獲取到消息之后,我們可以再 handleDevelivery 方法中處理我們的業務邏輯。

第 17 行,我們使用 channel 的 basicConsume 方法來將我們獲取到的消息進行一個消費。

事實上,我們應該使用 for 循環,或者動態獲取的方式,來指定我們工作隊列模式中,所需要的消費者數量,這樣我們才能實現一種沒有交換機的消息群發模式,這就是工作隊列模式。

Tips: 我們可以發現,在實現普通隊列模式和工作隊列模式時,我們并沒有指定 Routing Key ,因為這兩種消息發送模式不需要指定,這里需要同學們注意。

4. 小結

本小節為同學們詳細介紹了 RabbitMQ 消息發送模式之普通隊列模式和工作隊列模式的代碼實操等內容,包括普通隊列模式和工作隊列模式基礎概念等內容的回顧,以及普通隊列模式和工作隊列模式的代碼實現,同學們需要理清代碼實現的思路和步驟。

寫到這里,我們對 RabbitMQ 中常見的 5 種消息發送模式的實戰內容部分就全部介紹完畢了,在實際工作中,我們需要結合具體的業務場景,以及我們這些消息發送模式的基礎概念去篩選合適的消息發送模式,來完成我們的需求,這并不是一個隨便選擇的過程。