RabbitMQ是一個消息代理,它的核心原理非常簡單:接收和發送消息,你可以把它想象成一個郵局:你把信件放入郵箱,郵遞員就會把信件投遞到你的收件人處,RabbitMQ是一個郵箱、郵局、投遞員。
我們先來看最簡單的模式:一個發送者發送一條消息給一個接收者
註解:”P”是生產者,”C”是消費者,中間的部分是隊列用來保存消費者需要接收的消息的緩衝區域(這裏我們說緩存消費者需要接收的消息是因爲發送者發送的消息如果沒有被匹配規則匹配上就會被摒棄,不會再存儲到消息隊列中)。
API接口說明:
ConnectionFactory、Connection、Channel都是RabbitMQ對外提供的API中最基本的對象。
ConnectionFactory爲創建Connection的製造工廠。
Connection 是RabbitMQ基於socket的鏈接,它封裝了socket協議相關部分邏輯。
Channel是我們與RabbitMQ打交道的最重要的一個接口,我們大部分的業務操作是在Channel這個接口中完成的,包括定義Queue、定義Exchange、綁定Queue與Exchange、發佈消息等。
代碼示例
發送消息:
import java.io.IOException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Send01 {
public static void main(String[] args) throws IOException {
ConnectionFactory factory = new ConnectionFactory();
//RabbitMQ-Server安裝在本機,所以直接用127.0.0.1
factory.setHost("127.0.0.1");
//創建一個連接
Connection conn = factory.newConnection();
//創建一個通信通道
Channel channel = conn.createChannel();
//定義Queue名稱
String queueName = "queue01";
//爲Channel定義queue的屬性,queueName爲queue名稱,如果queue已被創建,不再重複創建
channel.queueDeclare(queueName, false, false,false,null);
String msg = "Hello World!";
//發送消息
channel.basicPublish("", queueName, null, msg.getBytes());
System.out.println("send message["+msg+"] to "+queueName+" success!");
//關閉通道
channel.close();
//關閉連接
conn.close();
}
}
接收消息:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
public class Recv01 {
public static void main(String[] args) throws Exception{
ConnectionFactory factory = new ConnectionFactory();
//RabbitMQ-Server安裝在本機,所以直接用127.0.0.1
factory.setHost("127.0.0.1");
//創建一個連接
Connection conn = factory.newConnection();
//創建一個通信通道
Channel channel = conn.createChannel();
//定義Queue名稱
String queueName = "queue01";
//爲Channel定義queue的屬性,queueName爲queue名稱,如果queue已被創建,不再重複創建
channel.queueDeclare(queueName, false, false,false,null);
///*--------------以上部分和sender一樣--------------------*/
//接收消息配置
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, true,consumer);
//循環獲取消息
while(true){
//獲取消息,如果沒有消息,這一步將會一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println("received message["+msg+"] from "+queueName);
}
}
}
臨時隊列
該例子中定義的隊列queue爲臨時隊列,通過RabbitMQ Server提供的管理工具可查看這一現象
1、運行上述代碼後,打開命令框,查看消息隊列,發現存在剛創建的隊列
2、重啓rabbitMQ的服務後重新查看,發現剛創建的隊列已經不存在