回覆列表
  • 1 # 程式設計字典

    RabbitMQ(教程:http://codingdict.com/article/22507)是一個訊息代理。它的核心原理非常簡單:接收和傳送訊息。你可以把它想像成一個郵局:你把信件放入郵箱,郵遞員就會把信件投遞到你的收件人處。在這個比喻中,RabbitMQ就扮演著郵箱、郵局以及郵遞員的角色。

    RabbitMQ和郵局的主要區別是,它不是用來處理紙張的,它是用來接收、儲存和傳送訊息(message)這種二進位制資料的。

    一般提到RabbitMQ和訊息,都會用到一些專有名詞。

    生產(Producing)意思就是傳送。傳送訊息的程式就是一個生產者(producer)。我們一般用"P"來表示:

    佇列(queue)就是郵箱的名稱。訊息透過你的應用程式和RabbitMQ進行傳輸,它們能夠只儲存在一個佇列(queue)中。 佇列(queue)沒有任何限制,你要儲存多少訊息都可以——基本上是一個無限的緩衝。多個生產者(producers)能夠把訊息傳送給同一個佇列,同樣,多個消費者(consumers)也能夠從同一個佇列(queue)中獲取資料。佇列可以繪製成這樣(圖上是佇列的名稱):

    消費(Consuming)和獲取訊息是一樣的意思。一個消費者(consumer)就是一個等待獲取訊息的程式。我們把它繪製為"C":

    需要指出的是生產者、消費者、代理需不要待在同一個裝置上;事實上大多數應用也確實不在會將他們放在一臺機器上。

    Hello World!

    (使用the Java Client)

    在教程的這部分,我們將要用Java寫兩個類;一個生產者(producer),它只發送一條訊息,和一個消費者,它接受訊息然後列印訊息出來.我們將掩蓋一些Java API中的細節,專注於讓這個簡單的Hello World程式跑起來.

    我們的大致的設計是這樣的:

    生產者(producer)把訊息傳送到一個名為“hello”的佇列中。消費者(consumer)從這個佇列中獲取訊息。

    The Java client library

    RabbitMQ可以有多種協議.這個教程使用AMQP 0-9-1協議,這個協議是一個開源的,多用途的訊息協議.我們將使用RabbitMQ給出的java客戶端來體驗RebbitMQ.

    下載rabbitmq的java客戶端庫,解壓然後獲取我們要用的jar包

    安裝過程依賴於pip和git-core兩個包,你需要先安裝它們。 (RabbitMQ的java客戶端在maven的中央倉庫也有,它的groupId是com.rabbitmq,artifactId是amqp-client)

    現在我們有了rabbitmq的Java客戶端庫和它的依賴,我們可以開始敲程式碼了.

    傳送訊息

    sender將會連線RabbitMQ,傳送一個訊息,然後退出

    在Send.java裡面,我們需要匯入一些類;

    import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Channel;

    建立這個類,以及給queue命名.

    public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv){ throws java.io.IOException { }}

    然後我們建立連線:

    ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();

    這個連線封裝了一個socket,同時處理好了訊息協議的版本和認證.這裡我們連線上了在本地(localhost)的一箇中間人(broker),如果你想要連線別的主機上的中間人,只需要修改一下主機名字或者IP地址

    下面,我們建立一個隧道(channel),這個隧道物件裡面有我們需要的API.

    要傳送訊息,我們必須先宣告一個佇列.

    channel.queueDeclare(QUEUE_NAME , false , false , false , null);String message = "Hello World";channel.basicPublish("",QUEUE_NAME,null,message.getBytes());System.out.println(" [x] Sent ""+message+""");

    宣告一個佇列是冪等操作 - 它將只在它不存在的時候被建立.訊息的內容是一個位元組陣列

  • 中秋節和大豐收的關聯?
  • 30萬以內樓蘭2.5L和寶馬X1 2.0T,哪款更適合家用?