RabbitMQ 六种基本队列模式 ----- 简单消息队列(Hello World)
RabbitMQ 是一个消息代理:它接受和转发消息。您可以将其视为邮局:当您将要投递的邮件放入邮箱时,您可以确定信件承运人最终会将邮件递送给您的收件人。在这个比喻中,RabbitMQ 是一个邮箱、一个邮局和一个信件载体。
在上图 “P” 是我们的生产者,“C” 是我们的消费者。中间的盒子是一个队列——RabbitMQ 代表消费者保留的消息缓冲区。再简单模式里面一个生产者只对应一个消费者
使用 java 实现简单的消息队列模式
-
我们来使用 java 实现这个简单的消息模式,首先导入 Maven 坐标。
<!-- <https://mvnrepository.com/artifact/com.rabbitmq/amqp-client> --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.9.0</version> </dependency> <!-- <https://mvnrepository.com/artifact/org.slf4j/slf4j-simple> --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <!-- <scope>test</scope>--> </dependency>
-
创建一个消费者(C)用来接收生产者(P)发来的消息
public static void main(String[] args) { try { //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 设置参数 factory.setHost("192.168.3.64"); factory.setPort(5672); factory.setVirtualHost("/default_virtual_host"); factory.setUsername("admin"); factory.setPassword("admin"); // 创建一个新的代理链接 Connection connection = factory.newConnection(); // 创建一个新的频道 Channel channel = connection.createChannel(); // 创建一个队列 channel.queueDeclare("hello_world", true, false, false, null); // 创建接收消息的回调 DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> { String s = new String(message.getBody(), StandardCharsets.UTF_8); System.out.println(s); }; channel.basicConsume("hello_world", true, deliverCallback, consumerTag -> {}); // 释放资源 由于消费者需要一直接收所以不需要关闭 // channel.close(); // connection.close(); } catch (Exception e) { e.fillInStackTrace(); } }
-
创建一个生产者(P)用来发送消息
public static void main(String[] args) { try { //创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); // 设置参数 factory.setHost("192.168.3.64"); factory.setPort(5672); factory.setVirtualHost("/default_virtual_host"); factory.setUsername("admin"); factory.setPassword("admin"); // 创建一个新的代理链接 Connection connection = factory.newConnection(); // 创建一个新的频道 Channel channel = connection.createChannel(); // 声明一个队列 channel.queueDeclare("hello_world", true, false, false, null); // 发送消息 String message = "这里是要发送的消息内容,比如我这个就是Hello World"; channel.basicPublish("", "hello_world", null, message.getBytes(StandardCharsets.UTF_8)); // 释放资源 channel.close(); connection.close(); } catch (Exception e) { e.fillInStackTrace(); } }
-
启动生产者和消费者的服务
-
启动生产者(P) 之后内容控制台返回的信息
-
查看 RabbitMQ Management 的信息,因为这时候还没有启动消费者(P)的服务所以下面会展示 Ready 状态的有一条消息
-
启动刚刚写的消费者(C)的服务,这时候就能看到控制到返回了一条消息
-
这时候 RabbitMQ Management 中为 Ready 状态的消息就为零了,因为被消费者的服务给消费掉了
-
欢迎前往我的个人博客 www.runbrick.com,博客园同步更新。