RabbitMQ的學習(二):簡單的java demo實現RabbitMQ的傳送與接收
阿新 • • 發佈:2018-12-18
通過第一章已經很輕鬆地實現了RabbitMQ的安裝和啟動,第二章開始最簡單的java demo學習,一層一層深入瞭解RabbitMQ的牛逼之處,期間肯定也會碰到很多問題,這些問題,將會收集起來,最後面去解決同時也會寫相關的文章。
一、專案相關jar包匯入:
新建一個maven工程,pom.xml中引入:
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.5.1</version> </dependency>
二、寫一個釋出者:
步驟:
客戶端:
- 建立一個連線工廠,用於生成與RabbitMQ進行連線
- 根據這個連線工廠設定RabbitMQ所在的主機,賬號密碼和埠號等(預設情況下就不需要賬號密碼和埠了)
- 由連線工廠生成與RabbitMQ的連線
- 建立一條通道,然後由這個通道宣告一個佇列
- 給這個佇列新增資訊
- 新增完畢後,關閉通道。
以下是客戶端的相關程式碼:
package rabbitmqDemo.demo1.client; import java.io.IOException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class Producer_demo1 { public final static String QUEUENAME="mq.test_demo1";//佇列名稱 public final static String HOST="localhost"; //主機名 public final static String USERNAME="guest"; public final static String PASSWORD="guest"; public final static String EXCHANGE_NAME=""; //交換機名(以後會學,不用太在意這個) public static void main(String[] args) { ConnectionFactory factory=new ConnectionFactory();//建立一個連線工廠,用於生成與RabbitMQ進行連線 factory.setHost(HOST);//根據這個連線工廠設定RabbitMQ所在的主機,賬號密碼和埠號等(預設情況下就不需要賬號密碼和埠了) factory.setUsername(USERNAME); factory.setPassword(PASSWORD); try { Connection connection = factory.newConnection();// 3. 由連線工廠生成與RabbitMQ的連線 Channel newChannel = connection.createChannel();//4. 建立一條通道 newChannel.queueDeclare(QUEUENAME,false,false,true,null);//由這個通道宣告一個佇列 String sendMessage="你好,我是生產者!";//要傳送的訊息 newChannel.basicPublish(EXCHANGE_NAME, QUEUENAME, null, sendMessage.getBytes()); System.out.println("訊息已傳送,去消費端控制檯看看"); newChannel.close();//關閉通道 connection.close();//關閉連線 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
三、寫一個消費者
步驟:
- 與上面的生產者一樣,一直到建立好通道為止;
- 通道建立好後,關聯相關的佇列
- 根據關聯的佇列,建立消費者物件,實現handleDelivery()方法,一直監聽以至有訊息時打印出訊息。
相關程式碼:
package rabbitmqDemo.demo1.consumer; import java.io.IOException; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Consumer; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; public class Consumer_demo1 { public final static String QUEUENAME="mq.test_demo1";//佇列名稱 public final static String HOST="localhost"; //主機名 public final static String USERNAME="guest"; public final static String PASSWORD="guest"; public final static String EXCHANGE_NAME=""; public static void main(String[] args) { ConnectionFactory factory=new ConnectionFactory();//建立一個連線工廠,用於生成與RabbitMQ進行連線 factory.setHost(HOST);//根據這個連線工廠設定RabbitMQ所在的主機,賬號密碼和埠號等(預設情況下就不需要賬號密碼和埠了) factory.setUsername(USERNAME); factory.setPassword(PASSWORD); Connection connection; try { connection = factory.newConnection(); Channel newChannel = connection.createChannel();//4. 建立一條通道,通道建立好後,關聯相關的佇列 newChannel.queueDeclare(QUEUENAME, false, false, true, null); Consumer consumer =new DefaultConsumer(newChannel){ //重寫handleDelivery方法 @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("消費端收到訊息: '" + message + "'"); } }; //自動回覆佇列應答 -- RabbitMQ中的訊息確認機制 newChannel.basicConsume(QUEUENAME, true, consumer); } catch (IOException e) { e.printStackTrace(); } } }
執行後得到資訊:
生產者:
消費者:
四、至此,一個簡單的java demo就寫完了。但光寫了不行,從這個小栗子中我們還是會有很多疑問,比如:
對於生產者端:
- RabbitMQ中的通道,到底是什麼意思,它和佇列又有著什麼關係?
- 生產者傳送資訊的時候,為什麼使用通道這個類的方法去傳送,而不是使用佇列這個類去傳送?
- 什麼是交換機?RabbitMQ的交換機有幾種?不同的交換機如何使用?
消費者端:
- Consumer的handleDelivery方法有什麼作用?
- 這個方法:new Channel.basicConsume(QUEUENAME, true, consumer);為什麼執行這個方法的時候,伺服器會一直監聽?是不是隱藏著實現while(true)之類的程式碼?
- AMQP是什麼,這個類有什麼作用?
帶著這些問題,我們以後會慢慢去學,去弄懂!