RabbitMq 安装使用教程(Windows)学习参考 csdn 大佬博客
【Windows安装RabbitMQ详细教程】
RabbitMq 详细概念及基于Java的基本操作 学习参考 Bilibili 视频教程,2倍速观看加实操记笔记等大概需要1整天 时间(本人前后花了3天)
【涛哥】最适合小白入门的RabbitMQ教程
RabbitMq 的逻辑结构(组成部分)
1,用户(Users)
可以设置用户级别(角色),用于登录管理平台、在java操作rabbitMq的时候用于建立连接;
2,虚拟主机(virtual-host)
相当于mysql数据库中的库,先建库,再建表;虚拟主机需要设置用户权限,让用户有权限使用这个虚拟主机
3,队列(Queues)
队列是建在 指定虚拟主机下的,相当于mysql 中的表;
4,交换机(ExChanges)
交换机是建在 指定虚拟主机下的,有2种类型的交换机 direct(路由形式) 和 fanout(订阅形式);交换机下需要绑定队列;
操作步骤(均可在管理后台内进行操作):
1,创建用户(非必要,内置管理员(登录管理平台)用户guest/guest)
2,创建虚拟主机;
3,创建队列;
4,创建交换机(交换机绑定队列)
RabbitMq 的工作模式
rabbitMq 提供了多种消息的通信方式
消息通信是由两个角色完成:消息生产者(producer)和消息消费者(Consumer)
-
简单模式:(生产者将消息发送到队列)
一个队列只有一个消费者;
生产者将消息发送到队列,消费者从队列取出数据; -
工作模式:(生产者将消息发送到队列)
多个消费者监听同一个队列;
多个消费者监听同一个队列,但多个消费者中只有一个消费者会成功消费消息; -
订阅模式:(生产者将消息发送到交换机)
生产者将消息发往交换机,交换机在把消息发送到自身绑定的所有的队列,相当于群发; -
路由模式:(生产者将消息发送到交换机)
生产者将消息发往交换机的时候可以指定一个Key(key 对应一个队列),再由交换机发往自身绑定的队列中的指定的队列;
基于Java (Maven项目)实现基本的消息发布与消费
1,导入Maven 依赖;
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.10.0</version>
</dependency>
2,编写连接工具类;
/**
* rabbitMq 建立连接工具类
*/
public class MqUtil {
public static Connection getConnection() throws IOException, TimeoutException {
//连接工厂
ConnectionFactory factory = new ConnectionFactory();
//服务Ip
factory.setHost("127.0.0.1");
//端口
factory.setPort(5672);
//虚拟主机(相当于连接 mysql 指定数据库)
factory.setVirtualHost("v-host1");
//用户名
factory.setUsername("wwf");
//密码
factory.setPassword("admin123");
//通过工厂创建连接
Connection connection = factory.newConnection();
return connection;
}
}
3,编写消息的生产者;
public class SendMsg2 {
public static void main(String[] args) throws Exception {
//需要发送的消息
String msg = "hello world!";
//通过工具类获得rabbitMq 连接
Connection connection = MqUtil.getConnection();
//创建通道
Channel channel = connection.createChannel();
/**
* 创建队列;【XXX一般不会在代码中进行创建XXX】
* 参数1:定义队列名称;
* 参数2:队列中的数据是否持久化
* 参数3:是否排外(当前队列是否由当前连接私有)
* 参数4:自动删除(当前队列连接数为0时自动删除队列,无论队列中是否有数据)
* 参数5: 设置当前队列的参数
*
*/
//channel.queueDeclare("v-host1-queue5",false,false,false,null);
/**
* 发送消息:
* 参数1:交换机名称,如果直接发送消息到队列,则交换机名称为 ""
* 参数2:目标队列名称
* 参数3:设置当前消息的属性(可设置过期时间 10)
* 参数4:消息的内容
*/
//1>>> 直接发送消息到指定队列【队列 v-host1-queue1 会收到消息】
channel.basicPublish("","v-host1-queue1",null,msg.getBytes());
//2>>> 发送消息到交换机 fanout 订阅模式【 交换机exchange1 下绑定的队列都会收到消息】
// channel.basicPublish("exchange1","",null,msg.getBytes());
//3>>> 发送消息到交换机 direct 路由模式【 交换机exchange3 下绑定的队列中设置的 key 为“key5” 的这个队列会收到消息 】
// channel.basicPublish("exchange3","key5",null,msg.getBytes());
System.out.println("发送消息:》》"+msg);
//关闭连接
connection.close();
}
}
4,编写消息的消费者;
public class RecMsg {
public static void main(String[] args) throws IOException, TimeoutException {
//通过工具类获取连接
Connection connection = MqUtil.getConnection();
//建立通道
Channel channel = connection.createChannel();
//获取消息
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//super.handleDelivery(consumerTag, envelope, properties, body);
String msg = new String(body);
System.out.println("消费者接受到的消息》》:"+msg);
}
};
channel.basicConsume("v-host1-queue1",true,consumer);
}
}
使用 SpringBoot 整合使用RabbitMq
1,添加Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2,application.yml 配置文件内添加配置;
server:
port: 8085
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
virtual-host: v-host1
username: wwf
password: admin123
3,编写消息生产者;
@Service
public class SendService {
@Autowired
private AmqpTemplate amqpTemplate;
public void sendMsg(String msg){
if(Objects.isNull(msg)){
System.out.println("消息为空!!");
return;
}
//简单模式
if(msg.startsWith("v")){
amqpTemplate.convertAndSend("v-host1-queue5",msg);
//工作模式
}else if(msg.startsWith("w")){
amqpTemplate.convertAndSend("v-host1-queue5",msg);
//订阅模式
}else if(msg.startsWith("f")){
amqpTemplate.convertAndSend("exchange1","",msg);
//路由模式
}else{
if(msg.startsWith("a")){
if("aaa".equals(msg)){
amqpTemplate.convertAndSend("exchange2","aaa",msg);
}else {
amqpTemplate.convertAndSend("exchange2","key7",msg);
}
}else {
amqpTemplate.convertAndSend("exchange2","key8",msg);
}
}
}
}
4,编写消息消费者;
@Service
//可以同时消费多个队列,但是正常一个消费者只消费一个队列。除非多个队列做的事是一样的
@RabbitListener(queues = {"q7"})
public class ConsumerMqService {
//字符串
@RabbitHandler
public void resMsg(String msg){
System.out.println("q7接受到的消息》》》:"+msg);
}
//字节数组
// @RabbitHandler
// public void resMsgByte(byte[] msg){
// System.out.println("接受到的消息》》》:"+new String(msg));
// }
}
2022-12-31 00:30
待补充…