RabbitMQ
【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】
文章目录
- RabbitMQ
- 第一天 基础
- 3 RabbitMQ 快速入门
- 3.2 入门程序
- 3.2.1 消费者
- 3.2.2 小结
第一天 基础
3 RabbitMQ 快速入门
3.2 入门程序
3.2.1 消费者
之前我们 已经完成了生产者的基本代码编写,并且创建了两条消息 在队列中等待消费
OK, 接下来就做一下消费者
在Consumer 模块来一个 类
package com.dingjiaxiong.consumer;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* ClassName: Consumer_HelloWorld
* date: 2022/11/16 12:37
*
* @author DingJiaxiong
*/
public class Consumer_HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
//1. 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 设置参数
factory.setHost("43.138.50.253"); // 服务器IP【默认本机 localhost】
factory.setPort(5672); //端口【默认也是 5672】
factory.setVirtualHost("/ding"); //虚拟机【 默认是 /】
factory.setUsername("dingjiaxiong"); // 用户名【默认 guest】
factory.setPassword("12345"); //密码【默认 guest】
//3. 创建连接 Connection
Connection connection = factory.newConnection();
//4. 创建Channel
Channel channel = connection.createChannel();
//5. 创建队列Queue
/**
* queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
* 参数解释:
* 1. queue:队列名称
* 2. durable:是否持久化【当mq 重启之后,还在】
* 3. exclusive:
* - 是否独占。只能有一个消费者监听这队列
* - 当Connection 关闭时,是否删除队列
* 4.autoDelete:是否自动删除【当没有Consumer 时,自动删除掉】
* 5.arguments:一些参数信息
* */
//【如果没有一个名字叫hello_world 的队列,则会创建该队列,如果有则不会创建】
channel.queueDeclare("hello_world",true,false,false,null);
// 接收消息【消费消息】
/**
* basicConsume(String queue, boolean autoAck, Consumer callback)
* 参数解释:
* 1. queue:队列名称
* 2. autoAck:是否自动确认
* 3. callback:回调对象
* */
Consumer consumer = new DefaultConsumer(channel){
//回调方法,当收到消息后,会自动执行这个 方法
/*
* 1. consumerTag:消息的标识
* 2. envelope:获取一些 信息【交换机、路由key...】
* 3. properties: 配置信息
* 4. body: 数据
* */
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("consumerTag:" + consumerTag);
System.out.println("Exchange:" + envelope.getExchange());
System.out.println("RoutingKey:" + envelope.getRoutingKey());
System.out.println("properties:" + properties);
System.out.println("body:" + new String(body));
}
};
channel.basicConsume("hello_world",true,consumer);
// 不要关闭资源,让它一直监听
}
}
OK
当前我们的 队列中 是有两条消息的
直接运行消费者
运行结果
OK, 两条消息都被拿到消费了
看看管控台
OK, 就是这样
3.2.2 小结
上述的入门案例中其实使用的是如下的简单模式:
在上图的模型中,有以下概念:
- P:生产者,也就是要发送消息的程序
- C:消费者:消息的接收者,会一直等待消息到来
- queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息