RabbitMQ(教程:http://codingdict.com/article/22507)是一個消息代理。它的核心原理非常簡單:接收和發送消息。你可以把它想像成一個郵局:你把信件放入郵箱,郵遞員就會把信件投遞到你的收件人處。在這個比喻中,RabbitMQ就扮演著郵箱、郵局以及郵遞員的角色。
RabbitMQ和郵局的主要區別是,它不是用來處理紙張的,它是用來接收、存儲和發送消息(message)這種二進制數據的。
一般提到RabbitMQ和消息,都會用到一些專有名詞。
生產(Producing)意思就是發送。發送消息的程序就是一個生產者(producer)。我們一般用"P"來表示:
隊列(queue)就是郵箱的名稱。消息通過你的應用程序和RabbitMQ進行傳輸,它們能夠只存儲在一個隊列(queue)中。隊列(queue)沒有任何限制,你要存儲多少消息都可以——基本上是一個無限的緩沖。多個生產者(producers)能夠把消息發送給同一個隊列,同樣,多個消費者(consumers)也能夠從同一個隊列(queue)中獲取數據。隊列可以繪制成這樣(圖上是隊列的名稱):
消費(Consuming)和獲取消息是一樣的意思。一個消費者(consumer)就是一個等待獲取消息的程序。我們把它繪制為"C":
需要指出的是生產者、消費者、代理需不要待在同一個設備上;事實上大多數應用也確實不在會將他們放在一臺機器上。
HelloWorld!
(使用theJavaClient)
在教程的這部分,我們將要用Java寫兩個類;一個生產者(producer),它只發送一條消息,和一個消費者,它接受消息然后打印消息出來.我們將掩蓋一些JavaAPI中的細節,專注于讓這個簡單的HelloWorld程序跑起來.
我們的大致的設計是這樣的:
生產者(producer)把消息發送到一個名為“hello”的隊列中。消費者(consumer)從這個隊列中獲取消息。
TheJavaclientlibrary
RabbitMQ可以有多種協議.這個教程使用AMQP0-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里面,我們需要導入一些類;
importcom.rabbitmq.client.ConnectionFactory;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.Channel;建立這個類,以及給queue命名.
publicclassSend{privatefinalstaticStringQUEUE_NAME="hello";publicstaticvoidmain(String[]argv){throwsjava.io.IOException{}}然后我們創建連接:
ConnectionFactoryfactory=newConnectionFactory();factory.setHost("localhost");Connectionconnection=factory.newConnection();Channelchannel=connection.createChannel();這個連接封裝了一個socket,同時處理好了消息協議的版本和認證.這里我們連接上了在本地(localhost)的一個中間人(broker),如果你想要連接別的主機上的中間人,只需要修改一下主機名字或者IP地址
下面,我們創建一個隧道(channel),這個隧道對象里面有我們需要的API.
要發送消息,我們必須先聲明一個隊列.
channel.queueDeclare(QUEUE_NAME,false,false,false,null);Stringmessage="HelloWorld";channel.basicPublish("",QUEUE_NAME,null,message.getBytes());System.out.println("[x]Sent'"+message+"'");聲明一個隊列是冪等操作-它將只在它不存在的時候被創建.消息的內容是一個字節數組