)
B站学习RabbitMQ笔记图灵1、使用场景2、安装RabbitMQ3、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_USERadmin \-e RABBITMQ_DEFAULT_PASSadmin123 \ 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{StringqueueName1mq_queue_name1;StringqueueName2mq_queue_name2;StringqueueName3mq_queue_name3;StringqueueName4mq_queue_name4;//路由key,StringroutingKey1routingKey1;StringroutingKey2routingKey2;StringroutingKey3routingKey3;StringroutingKey4routingKey4;StringexchangeNamemq_exchange_name;//创建一个连接工厂ConnectionFactoryfactorynewConnectionFactory();//mq服务端ipfactory.setHost(8.138.123.9);//mq账号factory.setUsername(admin);//mq密码factory.setPassword(admin123);//端口factory.setPort(5672);//创建连接Connectionconnectionfactory.newConnection();//创建信道Channelchannelconnection.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{//创建一个连接工厂ConnectionFactoryfactorynewConnectionFactory();//mq服务端ipfactory.setHost(8.138.123.9);//mq账号factory.setUsername(admin);//mq密码factory.setPassword(admin123);//端口factory.setPort(5672);//创建连接Connectionconnectionfactory.newConnection();//创建信道Channelchannelconnection.createChannel();DeliverCallbackdeliverCallback(consumerTag,message)-{System.out.println(接收到消息newString(message.getBody()));};CancelCallbackcancelCallbackconsumerTag-{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{StringqueueName1mq_queue_fanout_name1;StringqueueName2mq_queue_fanout_name2;StringqueueName3mq_queue_fanout_name3;StringqueueName4mq_queue_fanout_name4;//路由key,StringroutingKey1routingKey1;StringroutingKey2routingKey2;StringroutingKey3routingKey3;StringroutingKey4routingKey4;StringexchangeNamemq__fanout_exchange_name;//创建一个连接工厂ConnectionFactoryfactorynewConnectionFactory();//mq服务端ipfactory.setHost(8.138.123.9);//mq账号factory.setUsername(admin);//mq密码factory.setPassword(admin123);//端口factory.setPort(5672);//创建连接Connectionconnectionfactory.newConnection();//创建信道Channelchannelconnection.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);//发送消息Stringmsg1Fanout类型的交换机会把消息发送给所有与之绑定的队列;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{//创建一个连接工厂ConnectionFactoryfactorynewConnectionFactory();//mq服务端ipfactory.setHost(8.138.123.9);//mq账号factory.setUsername(admin);//mq密码factory.setPassword(admin123);//端口factory.setPort(5672);//创建连接Connectionconnectionfactory.newConnection();//创建信道Channelchannelconnection.createChannel();DeliverCallbackdeliverCallback(consumerTag,message)-{System.out.println(接收到消息newString(message.getBody()));};CancelCallbackcancelCallbackconsumerTag-{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{StringqueueName1mq_queue_topic_name1;StringqueueName2mq_queue_topic_name2;StringqueueName3mq_queue_topic_name3;StringqueueName4mq_queue_topic_name4;//路由key,StringroutingKey1routingKey1.#;StringroutingKey2*.routingKey2.#;StringroutingKey3#.routingKey3.*;StringroutingKey4#.routingKey4;StringexchangeNamemq__topic_exchange_name;//创建一个连接工厂ConnectionFactoryfactorynewConnectionFactory();//mq服务端ipfactory.setHost(8.138.123.9);//mq账号factory.setUsername(admin);//mq密码factory.setPassword(admin123);//端口factory.setPort(5672);//创建连接Connectionconnectionfactory.newConnection();//创建信道Channelchannelconnection.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{//创建一个连接工厂ConnectionFactoryfactorynewConnectionFactory();//mq服务端ipfactory.setHost(8.138.123.9);//mq账号factory.setUsername(admin);//mq密码factory.setPassword(admin123);//端口factory.setPort(5672);//创建连接Connectionconnectionfactory.newConnection();//创建信道Channelchannelconnection.createChannel();DeliverCallbackdeliverCallback(consumerTag,message)-{System.out.println(接收到消息newString(message.getBody()));};CancelCallbackcancelCallbackconsumerTag-{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);}}