版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Anbang713/article/details/82873048
一、基本概念
RabbitMQ是一个消息代理,它被用于接收并转发消息。官方文档里把它比作邮局,当我们要把寄发的邮件投递到邮箱中时,我们确信邮递员最终会将邮件发送给收件人。在这个比喻中,RabbitMQ是一个邮箱,邮局和邮递员。
RabbitMQ和邮局之间的主要区别在于它不处理消息数据,而是接收、存储和转发二进制数据块的消息。
生产意味着不仅仅是发送,我们称发送消息的程序是一个生产者。
队列就像是在RabbitMQ中扮演邮箱的角色。虽然消息流过RabbitMQ和我们应用程序,但它们只能存储在队列中。队列只受主机内存和磁盘限制的限制,它本质上是一个大的消息缓冲区。生产者发送消息到一个队列,消费者尝试从一个队列接收数据。
消费具有与接收相似的含义,而消费者主要是一个等待接收消息的程序。
需要注意的是:producer,consumer和broker(rabbitMQ server)在大多数应用程序中是分布式的。
二、Hello World
今天我们将用Java编写两个程序,用于发送单个消息的生产者,以及接收消息并将其打印出来的消费者。在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的框是队列 - RabbitMQ代表消费者的消息缓冲区。
2.1、添加RabbitMQ依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
2.2、获取MQ的连接
public class ConnectionUtil {
public static Connection getConnection() throws Exception {
// 定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置服务地址
factory.setHost("localhost");
// 端口
factory.setPort(5672);
// 设置账号信息,用户名、密码、vhost
factory.setVirtualHost("/");
factory.setUsername("rabbitmq");
factory.setPassword("rabbitmq");
// 通过工程获取连接
return factory.newConnection();
}
}
2.3、创建一个生产者发送消息到消息队列
public class Producer {
private final static String QUEUE_NAME = "simple_queue";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
// 从连接中创建通道
Channel channel = connection.createChannel();
// 声明(创建)队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 消息内容
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
// 关闭通道和连接
channel.close();
connection.close();
}
}
2.3.1、通过管理界面查看消息
点击上面的队列名称,查询具体的队列中的信息:
2.4、消费者从队列获取消息
public class Receiver {
private final static String QUEUE_NAME = "simple_queue";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 监听队列
channel.basicConsume(QUEUE_NAME, true, consumer);
// 获取消息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
if (message != null) {
System.out.println("Received Msg:" + message);
break;
}
}
}
}
2.5、接收消息
运行消费者,可以看到控制台有消息输出:
再次通过管理界面,可以看到simple_queue的队列已经没有消息需要接收了。