1. 程式人生 > >RabbitMQ的學習(二):簡單的java demo實現RabbitMQ的傳送與接收

RabbitMQ的學習(二):簡單的java demo實現RabbitMQ的傳送與接收

通過第一章已經很輕鬆地實現了RabbitMQ的安裝和啟動,第二章開始最簡單的java demo學習,一層一層深入瞭解RabbitMQ的牛逼之處,期間肯定也會碰到很多問題,這些問題,將會收集起來,最後面去解決同時也會寫相關的文章。

一、專案相關jar包匯入:

新建一個maven工程,pom.xml中引入:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.5.1</version>
</dependency>

二、寫一個釋出者:

步驟:

客戶端:

  1. 建立一個連線工廠,用於生成與RabbitMQ進行連線
  2. 根據這個連線工廠設定RabbitMQ所在的主機,賬號密碼和埠號等(預設情況下就不需要賬號密碼和埠了)
  3. 由連線工廠生成與RabbitMQ的連線
  4. 建立一條通道,然後由這個通道宣告一個佇列
  5. 給這個佇列新增資訊
  6. 新增完畢後,關閉通道。

以下是客戶端的相關程式碼:

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();
		}

	}

}

三、寫一個消費者

步驟:

  1. 與上面的生產者一樣,一直到建立好通道為止;
  2. 通道建立好後,關聯相關的佇列
  3. 根據關聯的佇列,建立消費者物件,實現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是什麼,這個類有什麼作用?

帶著這些問題,我們以後會慢慢去學,去弄懂!