☰
B站学习RabbitMQ笔记(图灵)
2026/10/15 19:32:50 网站建设 项目流程

B站学习RabbitMQ笔记(图灵)

  • 1、使用场景
  • 2、安装RabbitMQ
  • 3、RabbitMQ工作原理
  • 4、direct交换机
  • 5、fanout交换机
  • 6、topic交换机

1、使用场景

例如有一个推送数据到第三方接口的场景,可以把数据先推送到消息队列中,消费者接口消息并执行业务逻辑推送第三方接口,根据返回结果决定是ack(确认消息)还是重试/进死信队列。一定程度上(网络)可以做到消息必达第三方。

2、安装RabbitMQ

需要安装RabbitMQ并运行,生产者和消费者都连接到RabbitMQ,生产推送消息到RabbitMQ,消费者从RabbitMQ中接收消息。
可以把RabbitMQ安装到docker中,不用配置环境

docker run-d \--name rabbitmq \-p 5672:5672 \-p 15672:15672 \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=admin123 \ rabbitmq:management

启动后,管理界面地址为 http://ip:15672,账号密码分别为 admin / admin123。
如果访问不进去,就去阿里云开放端口

3、RabbitMQ工作原理

4、direct交换机

这个交换机是根据routingKey去找到对应的绑定queue,如果多个queue绑定了同一个routingKey,那么推送routingKey消息时,会推动到对应多个queue,观察生成者代码交换机和队列绑定

生产者

packagecom.example.rabbitmq1.demos.rabbitmq;importcom.rabbitmq.client.BuiltinExchangeType;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/** * @author daxia * @date 2026/10/12 * @description rabbitmq生产者 */publicclassProducerDirect{publicstaticvoidmain(String[]args)throwsIOException,TimeoutException{StringqueueName1="mq_queue_name1";StringqueueName2="mq_queue_name2";StringqueueName3="mq_queue_name3";StringqueueName4="mq_queue_name4";//路由key,StringroutingKey1="routingKey1";StringroutingKey2="routingKey2";StringroutingKey3="routingKey3";StringroutingKey4="routingKey4";StringexchangeName="mq_exchange_name";//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();//mq服务端ipfactory.setHost("8.138.123.9");//mq账号factory.setUsername("admin");//mq密码factory.setPassword("admin123");//端口factory.setPort(5672);//创建连接Connectionconnection=factory.newConnection();//创建信道Channelchannel=connection.createChannel();//创建交换机channel.exchangeDeclare(exchangeName,BuiltinExchangeType.DIRECT,true,false,null);//生成四个队列channel.queueDeclare(queueName1,true,false,false,null);channel.queueDeclare(queueName2,true,false,false,null);channel.queueDeclare(queueName3,true,false,false,null);channel.queueDeclare(queueName4,true,false,false,null);//队列和交换机绑定 key1 绑定三个队列,涂松key1消息时,三个队列都会收到消息channel.queueBind(queueName1,exchangeName,routingKey1);channel.queueBind(queueName2,exchangeName,routingKey1);channel.queueBind(queueName3,exchangeName,routingKey1);channel.queueBind(queueName4,exchangeName,routingKey4);//发送消息Stringmsg1="做完这个案例就可以休息了1";Stringmsg2="做完这个案例就可以休息了2";Stringmsg3="做完这个案例就可以休息了3";Stringmsg4="做完这个案例就可以休息了4";//channel.basicPublish(exchangeName,routingKey1,null,msg1.getBytes());channel.basicPublish(exchangeName,routingKey2,null,msg2.getBytes());channel.basicPublish(exchangeName,routingKey3,null,msg3.getBytes());channel.basicPublish(exchangeName,routingKey4,null,msg4.getBytes());channel.close();connection.close();}}

消费者

packagecom.example.rabbitmq3.rabbitmq;importcom.rabbitmq.client.*;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/** * @author daxia * @date 2026/10/12 * @description RabbitMQ消费者Direct */publicclassComsumerDirect{publicstaticvoidmain(String[]args)throwsIOException,TimeoutException{//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();//mq服务端ipfactory.setHost("8.138.123.9");//mq账号factory.setUsername("admin");//mq密码factory.setPassword("admin123");//端口factory.setPort(5672);//创建连接Connectionconnection=factory.newConnection();//创建信道Channelchannel=connection.createChannel();DeliverCallbackdeliverCallback=(consumerTag,message)->{System.out.println("接收到消息"+newString(message.getBody()));};CancelCallbackcancelCallback=consumerTag->{System.out.println("消息中断");};//消费消息channel.basicConsume("mq_queue_name1",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_name2",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_name3",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_name4",true,deliverCallback,cancelCallback);}}

5、fanout交换机

这个交换机是群发,会把消息推送到和当前交换机绑定的所有队列,并且routingKey会失效。
生产者

packagecom.example.rabbitmq1.demos.rabbitmq;importcom.rabbitmq.client.BuiltinExchangeType;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/** * @author daxia * @date 2026/10/12 * @description rabbitmq生产者 */publicclassProducerFanout{publicstaticvoidmain(String[]args)throwsIOException,TimeoutException{StringqueueName1="mq_queue_fanout_name1";StringqueueName2="mq_queue_fanout_name2";StringqueueName3="mq_queue_fanout_name3";StringqueueName4="mq_queue_fanout_name4";//路由key,StringroutingKey1="routingKey1";StringroutingKey2="routingKey2";StringroutingKey3="routingKey3";StringroutingKey4="routingKey4";StringexchangeName="mq__fanout_exchange_name";//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();//mq服务端ipfactory.setHost("8.138.123.9");//mq账号factory.setUsername("admin");//mq密码factory.setPassword("admin123");//端口factory.setPort(5672);//创建连接Connectionconnection=factory.newConnection();//创建信道Channelchannel=connection.createChannel();//创建交换机 FANOUT 是群发,所有和交换机绑定的队列都能接收到消息 routingKey无效channel.exchangeDeclare(exchangeName,BuiltinExchangeType.FANOUT,true,false,null);//生成四个队列channel.queueDeclare(queueName1,true,false,false,null);channel.queueDeclare(queueName2,true,false,false,null);channel.queueDeclare(queueName3,true,false,false,null);channel.queueDeclare(queueName4,true,false,false,null);//队列和交换机绑定 key1 绑定三个队列,涂松key1消息时,三个队列都会收到消息channel.queueBind(queueName1,exchangeName,routingKey1);channel.queueBind(queueName2,exchangeName,routingKey1);channel.queueBind(queueName3,exchangeName,routingKey1);channel.queueBind(queueName4,exchangeName,routingKey4);//发送消息Stringmsg1="Fanout类型的交换机,会把消息发送给所有与之绑定的队列";Stringmsg2="做完这个案例就可以休息了2";Stringmsg3="做完这个案例就可以休息了3";Stringmsg4="做完这个案例就可以休息了4";//channel.basicPublish(exchangeName,routingKey1,null,msg1.getBytes());channel.close();connection.close();}}

消费者

packagecom.example.rabbitmq3.rabbitmq;importcom.rabbitmq.client.*;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/** * @author daxia * @date 2026/10/12 * @description RabbitMQ消费者Fanout */publicclassComsumerFanout{publicstaticvoidmain(String[]args)throwsIOException,TimeoutException{//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();//mq服务端ipfactory.setHost("8.138.123.9");//mq账号factory.setUsername("admin");//mq密码factory.setPassword("admin123");//端口factory.setPort(5672);//创建连接Connectionconnection=factory.newConnection();//创建信道Channelchannel=connection.createChannel();DeliverCallbackdeliverCallback=(consumerTag,message)->{System.out.println("接收到消息"+newString(message.getBody()));};CancelCallbackcancelCallback=consumerTag->{System.out.println("消息中断");};//消费消息channel.basicConsume("mq_queue_fanout_name1",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_fanout_name2",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_fanout_name3",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_fanout_name4",true,deliverCallback,cancelCallback);}}

6、topic交换机

匹配规则
routing key 和 binding key 都是由 . 分隔的单词列表,例如 order.pay.success、user.login。
binding key 中支持两个通配符:
*:匹配恰好一个单词
#:匹配零个或多个单词
匹配是整个字符串的单词级匹配,不是子串匹配。
大小写敏感。
通配符通常要作为独立单词使用,例如.orange.、lazy.#、#.rabbit。
例如routingKey1.routingKey2.routingKey3.routingKey4就能匹配上代码中的四个routingKey

生产者

packagecom.example.rabbitmq1.demos.rabbitmq;importcom.rabbitmq.client.BuiltinExchangeType;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/** * @author daxia * @date 2026/10/12 * @description rabbitmq生产者 */publicclassProducerTopic{publicstaticvoidmain(String[]args)throwsIOException,TimeoutException{StringqueueName1="mq_queue_topic_name1";StringqueueName2="mq_queue_topic_name2";StringqueueName3="mq_queue_topic_name3";StringqueueName4="mq_queue_topic_name4";//路由key,StringroutingKey1="routingKey1.#";StringroutingKey2="*.routingKey2.#";StringroutingKey3="#.routingKey3.*";StringroutingKey4="#.routingKey4";StringexchangeName="mq__topic_exchange_name";//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();//mq服务端ipfactory.setHost("8.138.123.9");//mq账号factory.setUsername("admin");//mq密码factory.setPassword("admin123");//端口factory.setPort(5672);//创建连接Connectionconnection=factory.newConnection();//创建信道Channelchannel=connection.createChannel();//创建交换机 Topic交换机匹配队列时,是模糊匹配,有点类似正则表达式channel.exchangeDeclare(exchangeName,BuiltinExchangeType.TOPIC,true,false,null);//生成四个队列channel.queueDeclare(queueName1,true,false,false,null);channel.queueDeclare(queueName2,true,false,false,null);channel.queueDeclare(queueName3,true,false,false,null);channel.queueDeclare(queueName4,true,false,false,null);//队列和交换机绑定 key1 绑定三个队列,涂松key1消息时,三个队列都会收到消息channel.queueBind(queueName1,exchangeName,routingKey1);channel.queueBind(queueName2,exchangeName,routingKey1);channel.queueBind(queueName3,exchangeName,routingKey1);channel.queueBind(queueName4,exchangeName,routingKey4);//发送消息Stringmsg1="做完这个案例就可以休息了1";Stringmsg2="做完这个案例就可以休息了2";Stringmsg3="做完这个案例就可以休息了3";Stringmsg4="做完这个案例就可以休息了4";//channel.basicPublish(exchangeName,"routingKey1.routingKey2.routingKey3.routingKey4",null,msg1.getBytes());channel.close();connection.close();}}

消费者

packagecom.example.rabbitmq3.rabbitmq;importcom.rabbitmq.client.*;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/** * @author daxia * @date 2026/10/12 * @description RabbitMQ消费者Topic */publicclassComsumerTopic{publicstaticvoidmain(String[]args)throwsIOException,TimeoutException{//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();//mq服务端ipfactory.setHost("8.138.123.9");//mq账号factory.setUsername("admin");//mq密码factory.setPassword("admin123");//端口factory.setPort(5672);//创建连接Connectionconnection=factory.newConnection();//创建信道Channelchannel=connection.createChannel();DeliverCallbackdeliverCallback=(consumerTag,message)->{System.out.println("接收到消息"+newString(message.getBody()));};CancelCallbackcancelCallback=consumerTag->{System.out.println("消息中断");};//消费消息channel.basicConsume("mq_queue_topic_name1",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_topic_name2",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_topic_name3",true,deliverCallback,cancelCallback);channel.basicConsume("mq_queue_topic_name4",true,deliverCallback,cancelCallback);}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询