文章目录
RabbitMQ原理图
发布消息需要经过Exchange交换机,然后它根据自身的交换类型以及和Queue的Binding Key来决定这条消息是发送到哪个队列。
基本操作流程
- 创建ConnectionFactory对象,利用抽象工厂模式获取连接。
- 从获取的连接中获取通道。
- 创建队列,将通道与队列绑定。
- 生产者通过将消息放入队列中,消费者创建消费对象从队列中获取消息。
实例1
描述
生产者:在现实生活中就好比制造商品的工厂,他们是商品的生产者。生产者只意味着发送。发送消息的程序称之为一个生产者。我们用“P”表示。
队列:队列就像存放商品的仓库或者商店,是生产商品的工厂和购买商品的用户之间的中转站。队列就像是一个仓库或者流水线。在RabbitMQ中,信息流从你的应用程序出发,来到RabbitMQ的队列,所有信息可以只存储在一个队列中。队列可以存储很多的消息,因为它基本上是一个无限制的缓冲区,前提是你的机器有足够的存储空间。多个生产者可以将消息发送到同一个队列中,多个消费者也可以只从同一个队列接收数据。这就是队列的特性。
消费者:消费者就好比是从商店购买或从仓库取走商品的人,消费的意思就是接收。消费者是一个程序,主要是等待接收消息。我们的用“C”表示。
注意:生产者,消费者和队列(RabbitMQ)不必部署在同一台机器上。实际在生产环境的大多数应用中,他们都是分开部署的。
我们通过2个Java程序,一个发送消息的生产者、一个接收信息并打印的消费者。
代码
public class Producer {
//队列命名
public static final String QUEUE_NAME="hello";
public static void main(String[] args) {
//创建工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//设置属性
connectionFactory.setHost("master");
connectionFactory.setUsername("mall");
connectionFactory.setPassword("mall");
try {
//获得连接
Connection connection=connectionFactory.newConnection();
//创建通道
Channel channel=connection.createChannel();
//创建队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
String msg="hello world!!";
//发送消息
/*
exchange 交换器名称
props 有14个成员
body 消息体,payload真正需要发送的消息
*/
channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
System.out.println("发送"+msg+"成功");
//断开通道和连接
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
public class Consumer {
//队列命名
public static final String QUEUE_NAME = "hello";
public