RabbitMQ-簡單佇列
一、基本概念
RabbitMQ是一個訊息代理,它被用於接收並轉發訊息。官方文件裡把它比作郵局,當我們要把寄發的郵件投遞到郵箱中時,我們確信郵遞員最終會將郵件傳送給收件人。在這個比喻中,RabbitMQ是一個郵箱,郵局和郵遞員。
RabbitMQ和郵局之間的主要區別在於它不處理訊息資料,而是接收、儲存和轉發二進位制資料塊的訊息。
生產意味著不僅僅是傳送,我們稱傳送訊息的程式是一個生產者。
佇列就像是在RabbitMQ中扮演郵箱的角色。雖然訊息流過RabbitMQ和我們應用程式,但它們只能儲存在佇列中。佇列只受主機記憶體和磁碟限制的限制,它本質上是一個大的訊息緩衝區。生產者傳送訊息到一個佇列,消費者嘗試從一個佇列接收資料。
消費具有與接收相似的含義,而消費者主要是一個等待接收訊息的程式。
需要注意的是:producer,consumer和broker(rabbitMQ server)在大多數應用程式中是分散式的。
二、Hello World
今天我們將用Java編寫兩個程式,用於傳送單個訊息的生產者,以及接收訊息並將其列印出來的消費者。在下圖中,“P”是我們的生產者,“C”是我們的消費者。中間的框是佇列 - RabbitMQ代表消費者的訊息緩衝區。
2.1、新增RabbitMQ依賴
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
2.2、獲取MQ的連線
public class ConnectionUtil {
public static Connection getConnection() throws Exception {
// 定義連線工廠
ConnectionFactory factory = new ConnectionFactory();
// 設定服務地址
factory.setHost("localhost");
// 埠
factory.setPort(5672);
// 設定賬號資訊,使用者名稱、密碼、vhost
factory.setVirtualHost("/");
factory.setUsername("rabbitmq");
factory.setPassword("rabbitmq");
// 通過工程獲取連線
return factory.newConnection();
}
}
2.3、建立一個生產者傳送訊息到訊息佇列
public class Producer {
private final static String QUEUE_NAME = "simple_queue";
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
// 從連線中建立通道
Channel channel = connection.createChannel();
// 宣告(建立)佇列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 訊息內容
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
// 關閉通道和連線
channel.close();
connection.close();
}
}
2.3.1、通過管理介面檢視訊息
點選上面的佇列名稱,查詢具體的佇列中的資訊:
2.4、消費者從佇列獲取訊息
public class Receiver {
private final static String QUEUE_NAME = "simple_queue";
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告佇列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 定義佇列的消費者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 監聽佇列
channel.basicConsume(QUEUE_NAME, true, consumer);
// 獲取訊息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
if (message != null) {
System.out.println("Received Msg:" + message);
break;
}
}
}
}
2.5、接收訊息
執行消費者,可以看到控制檯有訊息輸出:
再次通過管理介面,可以看到simple_queue的佇列已經沒有訊息需要接收了。
相關文章
- 【訊息佇列】RabbitMq-宣告佇列與交換機佇列MQ
- 【訊息佇列】RabbitMq-交換機模型佇列MQ模型
- python中佇列簡單使用Python佇列
- laravel 佇列的簡單使用Laravel佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- 佇列-單端佇列佇列
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- “簡單”的訊息佇列與kafka佇列Kafka
- redis訊息佇列簡單應用Redis佇列
- 簡單易用的任務佇列-beanstalkd佇列Bean
- 1284 海港 普及組 NOIP2016 佇列基礎 簡單列舉 簡單模擬 優先佇列(priority_queue)佇列
- 單調佇列雙端佇列佇列
- 單調佇列佇列
- Rust 程式設計,實現簡單的佇列Rust程式設計佇列
- node事件迴圈和訊息佇列簡單分析事件佇列
- 單調棧/單調佇列佇列
- 棧與佇列簡介佇列
- 訊息佇列簡史佇列
- 單向鏈式佇列佇列
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- 新手也能看懂,訊息佇列其實很簡單佇列
- 【佇列】【利用Flag最佳化】簡單的資料結構佇列資料結構
- 佇列_單向連結串列佇列
- 佇列、阻塞佇列佇列
- C++STL第四篇(最簡單的棧和佇列)C++佇列
- WPF下使用FreeRedis操作RedisStream實現簡單的訊息佇列Redis佇列
- leetcode 232. Implement Queue using Stacks 用棧實現佇列(簡單)LeetCode佇列
- 用 Golang 跑「佇列任務」,也可以像 Laravel 一樣簡單Golang佇列Laravel
- 單調佇列最佳化 DP佇列
- 從簡單的線性資料結構開始:棧與佇列資料結構佇列
- C#使用RabbitMq佇列(Sample,Work,Fanout,Direct等模式的簡單使用)C#MQ佇列模式
- Java併發(10)- 簡單聊聊JDK中的七大阻塞佇列JavaJDK佇列
- 簡析Python中的四種佇列Python佇列
- 佇列 和 迴圈佇列佇列
- 【佇列】【懶排序】佇列Q佇列排序
- 自定義單連結串列佇列的基本介面函式(非迴圈佇列)佇列函式
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列