news 2026/7/17 4:04:33

常用:SpringBoot项目引入RabbitMQ步骤

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
常用:SpringBoot项目引入RabbitMQ步骤

1.引入依赖:

pom.xml添加依赖

<!--核心starter,内置amqp‑client--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>

2.配置文件application.yml

spring: rabbitmq: addresses: amqp://登录RabbitMQ的用户名:登录的密码@部署RabbitMQ服务的公网IP地址:端口/虚拟机名 listener: simple: acknowledge-mode: auto #消息接收确认(自动),默认是auto,这里是为了直观观察 #以上为必写,以下为可选 # #acknowledge-mode: manual #消息接收确认(手动) # #prefetch: 1 #消费者持有最大待消费消息数 # #retry: # #enabled: true # 开启消费者失败重试 # #initial-interval: 5000ms # 初始失败等待时长为5秒 # #max-attempts: 5 # 最大重试次数 # #publisher-confirm-type: correlated #消息发送确认 # #publisher-returns: true #设置回退

3.创建一个常量类(存相关名称)和一个配置类(交换机,队列,绑定关系都写里面)

Constants类:

package com.txm.rabbitmq.constant; public class Constants { //工作模式 public static final String WORK_QUEUE="work.queue"; //发布订阅模式fanout public static final String FANOUT_QUEUE1="fanout.queue1"; public static final String FANOUT_QUEUE2="fanout.queue2"; public static final String FANOUT_EXCHANGE="fanout.exchange"; //路由模式 public static final String DIRECT_QUEUE1="direct.queue1"; public static final String DIRECT_QUEUE2="direct.queue2"; public static final String DIRECT_EXCHANGE="direct.exchange"; //通配符模式 public static final String TOPIC_QUEUE1="topic.queue1"; public static final String TOPIC_QUEUE2="topic.queue2"; public static final String TOPIC_EXCHANGE="topic.exchange"; }

Config类:

package com.txm.rabbitmq.config; import com.txm.rabbitmq.constant.Constants; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { //工作模式 //声明队列 @Bean("workQueue") public Queue workQueue(){ return QueueBuilder.durable(Constants.WORK_QUEUE).build(); } //发布订阅模式 //1.声明队列 @Bean("fanoutQueue1") public Queue fanoutQueue1(){ return QueueBuilder.durable(Constants.FANOUT_QUEUE1).build(); } @Bean("fanoutQueue2") public Queue fanoutQueue2(){ return QueueBuilder.durable(Constants.FANOUT_QUEUE2).build(); } //2.声明交换机 @Bean("fanoutExchange") public FanoutExchange fanoutExchange(){ return ExchangeBuilder.fanoutExchange(Constants.FANOUT_EXCHANGE).durable(true).build(); } //3.声明交换机和队列的绑定关系 @Bean("fanoutQueueBinding1") public Binding fanoutQueueBinding1(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange,@Qualifier("fanoutQueue1") Queue queue){ return BindingBuilder.bind(queue).to(fanoutExchange); } @Bean("fanoutQueueBinding2") public Binding fanoutQueueBinding2(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange,@Qualifier("fanoutQueue2") Queue queue){ return BindingBuilder.bind(queue).to(fanoutExchange); } //路由模式 //1.声明队列 @Bean("directQueue1") public Queue DIRECT_QUEUE1(){ return QueueBuilder.durable(Constants.DIRECT_QUEUE1).build(); } @Bean("directQueue2") public Queue DIRECT_QUEUE2(){ return QueueBuilder.durable(Constants.DIRECT_QUEUE2).build(); } //2.声明交换机 @Bean("directExchange") public DirectExchange DIRECT_EXCHANGE(){ return ExchangeBuilder.directExchange(Constants.DIRECT_EXCHANGE).durable(true).build(); } //3.声明交换机和队列的绑定关系 @Bean("directQueueBinding1") public Binding directQueueBinding1(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue1") Queue queue){ return BindingBuilder.bind(queue).to(directExchange).with("orange"); } @Bean("directQueueBinding2") public Binding directQueueBinding2(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){ return BindingBuilder.bind(queue).to(directExchange).with("black"); } @Bean("directQueueBinding3") public Binding directQueueBinding3(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){ return BindingBuilder.bind(queue).to(directExchange).with("orange"); } //通配符模式 //1.声明队列 @Bean("topicQueue1") public Queue topicQueue1(){ return QueueBuilder.durable(Constants.TOPIC_QUEUE1).build(); } @Bean("topicQueue2") public Queue topicQueue2(){ return QueueBuilder.durable(Constants.TOPIC_QUEUE2).build(); } //2.声明交换机 @Bean("topicExchange") public TopicExchange TOPIC_EXCHANGE(){ return ExchangeBuilder.topicExchange(Constants.TOPIC_EXCHANGE).durable(true).build(); } //3.声明交换机和队列的绑定关系 @Bean("topicQueueBinding1") public Binding topicQueueBinding1(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue1") Queue queue){ return BindingBuilder.bind(queue).to(topicExchange).with("*.orange.*"); } @Bean("topicQueueBinding2") public Binding topicQueueBinding2(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue2") Queue queue){ return BindingBuilder.bind(queue).to(topicExchange).with("*.*.rabbit"); } @Bean("topicQueueBinding3") public Binding topicQueueBinding3(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue2") Queue queue){ return BindingBuilder.bind(queue).to(topicExchange).with("lazy.#"); } }

4.写生产者(Controller类,发送消息):

直接注入RabbitTemplate发送消息:

package com.txm.rabbitmq.controller; import com.txm.rabbitmq.constant.Constants; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/producer") @RestController public class ProducerController { @Autowired private RabbitTemplate rabbitTemplate; //工作队列模式 @RequestMapping("/work") public String work(){ for (int i = 0; i < 10; i++) { //使用内置交换机,RoutingKey和队列名称一致 rabbitTemplate.convertAndSend("", Constants.WORK_QUEUE,"hello spring amqp:Lwork ..."+i); } return "发送成功"; } //发布订阅模式(fanout交换机) @RequestMapping("/fanout") public String fanout(){ rabbitTemplate.convertAndSend(Constants.FANOUT_EXCHANGE,"","hello spring amqp:fanout..."); return "发送成功"; } //路由模式 @RequestMapping("/direct/{routingKey}") public String direct(@PathVariable("routingKey") String routingKey){ rabbitTemplate.convertAndSend(Constants.DIRECT_EXCHANGE,routingKey,"hello spring amqp:direct,my routingKey is "+routingKey); return "发送成功"; } //通配符模式 @RequestMapping("/topic/{routingKey}") public String topic(@PathVariable("routingKey") String routingKey){ rabbitTemplate.convertAndSend(Constants.TOPIC_EXCHANGE,routingKey,"hello spring amqp:topic,my routingKey is "+routingKey); return "发送成功"; } }

5.写消费者(listener类,监听消息)

<1>工作队列模式-消费者:

package com.txm.rabbitmq.listener; import com.txm.rabbitmq.constant.Constants; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * 工作队列模式-消费者 */ @Component public class WorkListener { @RabbitListener(queues=Constants.WORK_QUEUE) public void queueListener1(Message message){ System.out.println("listener 1 ["+ Constants.WORK_QUEUE+"] 接收到消息:"+message); } @RabbitListener(queues=Constants.WORK_QUEUE) public void queueListener2(Message message){ System.out.println("listener 2 ["+ Constants.WORK_QUEUE+"] 接收到消息:"+message); } }

<2>发布订阅模式(广播模式)-消费者:

package com.txm.rabbitmq.listener; import com.txm.rabbitmq.constant.Constants; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * 发布订阅模式-消费者 */ @Component public class FanoutListener { @RabbitListener(queues=Constants.FANOUT_QUEUE1) public void queueListener1(String message){ System.out.println("队列["+ Constants.FANOUT_QUEUE1+"] 接收到消息:"+message); } @RabbitListener(queues=Constants.FANOUT_QUEUE2) public void queueListener2(Message message){ System.out.println(" 队列["+ Constants.FANOUT_QUEUE2+"] 接收到消息:"+message); } }

<3>路由模式-消费者:

package com.txm.rabbitmq.listener; import com.txm.rabbitmq.constant.Constants; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * 路由模式-消费者 */ @Component public class DirectListener { @RabbitListener(queues=Constants.DIRECT_QUEUE1) public void queueListener1(String message){ System.out.println("队列["+ Constants.DIRECT_QUEUE1+"] 接收到消息:"+message); } @RabbitListener(queues=Constants.DIRECT_QUEUE2) public void queueListener2(String message){ System.out.println(" 队列["+ Constants.DIRECT_QUEUE2+"] 接收到消息:"+message); } }

<4>通配符模式-消费者:

package com.txm.rabbitmq.listener; import com.txm.rabbitmq.constant.Constants; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * 通配符模式-消费者 */ @Component public class TopicListener { @RabbitListener(queues=Constants.TOPIC_QUEUE1) public void queueListener1(String message){ System.out.println("队列["+ Constants.TOPIC_QUEUE1+"] 接收到消息:"+message); } @RabbitListener(queues=Constants.TOPIC_QUEUE2) public void queueListener2(String message){ System.out.println(" 队列["+ Constants.TOPIC_QUEUE2+"] 接收到消息:"+message); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 4:04:33

具身智能落地实战:实时闭环、多模态同步与物理约束破解

1. 项目概述&#xff1a;这不是又一个AI概念炒作&#xff0c;而是控制论与机器人学三十年沉淀的临界点“具身智能”这个词最近在科技媒体上高频闪现&#xff0c;但很多人点开文章后只看到一堆“具身即智能”“身体是认知的起点”之类的哲学式断言&#xff0c;配上几张人形机器人…

作者头像 李华
网站建设 2026/7/17 4:03:33

AI智能体安全实战:MoltLock三层防御体系部署与调优指南

1. 项目概述&#xff1a;当AI智能体走出沙盒最近和几个做AI应用开发的朋友聊天&#xff0c;大家普遍反映一个头疼的问题&#xff1a;智能体&#xff08;Agent&#xff09;能力越来越强&#xff0c;能调用API、访问数据库、甚至操作外部系统&#xff0c;但随之而来的安全风险也像…

作者头像 李华
网站建设 2026/7/17 4:01:43

RK3568电源系统设计与DCDC电路布局要点解析

1. RK3568电源系统架构解析作为Rockchip新一代中高端SoC&#xff0c;RK3568的电源设计直接关系到系统稳定性和性能释放。这颗22nm工艺的四核A55处理器集成了丰富的外设接口&#xff0c;其电源需求呈现出"多电压域、大电流动态切换"的特点。从热词分析可见&#xff0c…

作者头像 李华
网站建设 2026/7/17 4:01:37

具身智能的硬件平台:物理化身即第一性原理

1. 为什么“具身智能”不能只活在代码里&#xff1a;物理化身不是附加项&#xff0c;而是第一性原理“具身智能”这个词最近在技术圈被反复提起&#xff0c;但很多人一听到就下意识点开论文PDF&#xff0c;或者直接跳转到大模型API调用文档——这恰恰踩进了最根本的认知陷阱。我…

作者头像 李华
网站建设 2026/7/17 4:01:32

SQL Server 2005跨网段连接问题与解决方案

1. 问题背景&#xff1a;SQL Server 2005跨网段连接困境十年前我在银行系统做数据库迁移时&#xff0c;第一次遭遇SQL Server 2005跨网段连接的诡异问题。当时支行网点需要访问总部的报表数据库&#xff0c;明明防火墙端口全开、账号权限正确&#xff0c;但就是提示"找不到…

作者头像 李华
网站建设 2026/7/17 4:00:52

大模型量化技术:对称与非对称量化的原理与实践

1. 大模型量化的核心挑战与解决思路在大模型部署和推理过程中&#xff0c;内存占用和计算效率是两大核心瓶颈。以1750亿参数的GPT-3模型为例&#xff0c;使用FP32精度存储需要约700GB显存&#xff0c;这远超当前主流GPU的显存容量&#xff08;如A100 80GB&#xff09;。量化技术…

作者头像 李华