java 使用RabbitMQ樣本

來源:互聯網
上載者:User
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!'

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.