RabbitMQ-簡單佇列

Anbang713發表於2018-09-27

一、基本概念

RabbitMQ是一個訊息代理,它被用於接收並轉發訊息。官方文件裡把它比作郵局,當我們要把寄發的郵件投遞到郵箱中時,我們確信郵遞員最終會將郵件傳送給收件人。在這個比喻中,RabbitMQ是一個郵箱,郵局和郵遞員。

RabbitMQ和郵局之間的主要區別在於它不處理訊息資料,而是接收、儲存和轉發二進位制資料塊的訊息。

生產意味著不僅僅是傳送,我們稱傳送訊息的程式是一個生產者。

佇列就像是在RabbitMQ中扮演郵箱的角色。雖然訊息流過RabbitMQ和我們應用程式,但它們只能儲存在佇列中。佇列只受主機記憶體和磁碟限制的限制,它本質上是一個大的訊息緩衝區。生產者傳送訊息到一個佇列,消費者嘗試從一個佇列接收資料。

消費具有與接收相似的含義,而消費者主要是一個等待接收訊息的程式。

需要注意的是:producer,consumer和broker(rabbitMQ server)在大多數應用程式中是分散式的。

二、Hello World

今天我們將用Java編寫兩個程式,用於傳送單個訊息的生產者,以及接收訊息並將其列印出來的消費者。在下圖中,“P”是我們的生產者,“C”是我們的消費者。中間的框是佇列 - RabbitMQ代表消費者的訊息緩衝區。

image

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的佇列已經沒有訊息需要接收了。

原始碼地址:https://gitee.com/chengab/RabbitMQ 

相關文章