RabbitMQ簡介
RabbitMQ是一個受歡迎的訊息代理,通常用於應用程式之間或者程式的不同組件之間通過訊息來進行整合。具有高可用高並發的優點,適合叢集伺服器。採用 Erlang實現, 對主要的程式設計語言都有用戶端支援。 RabbitMQ環境配置 linux下環境配置
我用的是centos 6.5版本。
先從這個地址下載安裝包
下載地址
$ tar -zxvf otp_src_18.3.tar.gz $ cd otp_src_18.3$ ./configure --prefix=/usr/local/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac$ make$ sudo make install
配置環境變數
vim /etc/profile
在檔案末尾添加下面文字:
ERLANG_HOME=/usr/local/erlangPATH=$ERLANG_HOME/bin:$PATHexport ERLANG_HOMEexport PATH
使環境變數生效
source /etc/profile
然後下載RabbitMQ,下載地址
先安裝依賴
$ sudo yum install xmlto
$ xz -d rabbitmq-server-generic-unix-3.6.1.tar.xz$ tar -xvf rabbitmq-server-generic-unix-3.6.1.tar # 移動目錄$ sudo cp -rf ./rabbitmq_server-3.6.1/ /usr/local/$ cd /usr/local#改名字$ mv rabbitmq_server-3.6.1 rabbitmq-3.6.1# 安裝web管理外掛程式$ cd sbin/$ ./rabbitmq-plugins enable rabbitmq_management
啟動和關閉服務
$ ./rabbitmq-server# 後台啟動$ ./rabbitmq-server -detached# 關閉$ ./rabbitmqctl stop
登入web管理端
啟動rabbitmq,然後瀏覽器輸入
http://10.0.0.221:15672/
這個ip地址是你實際安裝的主機的ip,請根據實際情況修改。
下面配置登入帳號
$ ./rabbitmqctl add_user pony 123456Creating user "pony" ...$ ./rabbitmqctl set_user_tags pony administrator Setting tags for user "pony" to [administrator] ...
重新整理下,用剛才建立的帳號登入,如下:
有一點要注意,如果主機配有防火牆,要把用到的連接埠都開啟
-A INPUT -p tcp -m state --state NEW -m tcp --dport 15672 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 25672 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 5672 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 4369 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 5671 -j ACCEPT
windows下環境配置
erlang下載地址
rabbitmq下載地址
可以根據需要下載自己所需要的版本,我這裡下載的分別是:
otp_win64_18.3.exe和rabbitmq-server-3.6.9.exe
預設安裝otp_win64_18.3.exe,完成後,配置環境變數
ERLANG_HOME C:\Program Files\erl7.3
添加到PATH
%ERLANG_HOME%\bin;
預設安裝rabbitmq-server-3.6.9.exe,完成後,配置環境變數
RABBITMQ_SERVER C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.9
添加到PATH
%RABBITMQ_SERVER%\sbin;
進入sbin目錄開啟一個控制台,安裝web管理外掛程式
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.9\sbin>rabbitmq-plugins.bat enable rabbitmq_management
然後重啟下服務使上面的配置生效(注意這裡要使用管理員開啟cmd命令列,路徑無影響),
C:\WINDOWS\system32>net stop RabbitMQ && net start RabbitMQRabbitMQ 服務正在停止.RabbitMQ 服務已成功停止。RabbitMQ 服務正在啟動 .RabbitMQ 服務已經啟動成功。C:\WINDOWS\system32>
開啟瀏覽器,輸入http://localhost:15672/,可以正常訪問。由於我是在本機安裝,所以這裡是localhost。
接下來配置一個帳號並賦予管理員權限(當然要確保是啟動狀態),
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.9\sbin>rabbitmqctl.bat add_user pony 123456Creating user "pony" ...C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.9\sbin>rabbitmqctl.bat set_user_tags pony administratorSetting tags for user "pony" to [administrator] ...
在web端用這個帳號登入,可以成功。 java調用樣本
我的開發環境是myeclipse+win10,windows環境下已經按照前面章節配置好了rabbitmq服務。**然後保持啟動狀態。**java要使用rabbitmq需要依賴一個用戶端。下載地址
如果用maven的話就不用下載,設定檔加上依賴描述即可。
我這裡建立兩個工程,分別為RabbitMQDemo-P(表示生產者)和RabbitMQDemo-C(表示消費者),兩個工程運行起來後就代表兩個獨立的進程通過訊息佇列通訊。生產者不斷的往訊息佇列發送訊息,而消費者不斷的從隊列取訊息。工程中匯入前面下載的用戶端依賴包。
源碼來自:rabbitmq-tutorials
eclipse工程源碼下載地址
先生產者的代碼:
private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost");//因為兩個進程在同一個機器上 Connection connection = null; Channel channel = null; connection = factory.newConnection(); channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [Producer] Sent '" + message + "'"); channel.close(); connection.close(); }
比較簡單,涉及到的API具體說明可以自行搜尋學習。運行一次就往名為hello的隊列上發布一條訊息:”Hello World”,然後進程結束。
消費者稍微複雜一點,
private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [Consumer] Received '" + message + "'"); } }; channel.basicConsume(QUEUE_NAME, true, consumer); }
Channel.basicConsume方法將Consumer與訊息佇列綁定,它的定義如下:
String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException
第一個參數是Consumer綁定的隊列名,第二個參數是自動確認標誌,如果為true,表示Consumer接受到訊息後,會自動發確認訊息(Ack訊息)給訊息佇列,訊息佇列會將這條訊息從訊息佇列裡刪除,第三個參數就是Consumer對象,用於處理接收到的訊息。
第三個參數其實是個回調,當消費者收到訊息時,會調用Consumer對象的handleDelivery方法。我們這裡重寫了這個方法,收到訊息之後列印出來。
先運行消費者,如下:
[*] Waiting for messages. To exit press CTRL+C
開始等待訊息。
再運行生產者,如下:
[Producer] Sent 'Hello World!'
再次看下消費者的控制台資訊,接收到訊息:
[*] Waiting for messages. To exit press CTRL+C [Consumer] Received 'Hello World!'