请描述在 Spring Boot 项目中集成 RabbitMQ 时,消息发送和处理(消费)的完整流程。包括如何配置连接、如何发送消息到交换机或队列、如何声明队列和交换机、以及如何接收和处理消息。
考察说明
考查候选人对 Spring Boot 集成 RabbitMQ 的实践理解,包括消息发布、消费配置、以及常见问题的处理。
回答思路
- 【回答框架 1】在 Spring Boot 项目中集成 RabbitMQ 通常通过 spring-boot-starter-amqp 依赖实现,该依赖自动配置了 ConnectionFactory、RabbitTemplate 和监听容器。
- 【回答框架 2】消息发送使用 RabbitTemplate 的 convertAndSend 方法,可以指定交换机、路由键和消息体;也可以不指定交换机而使用默认交换机直接发送到队列(此时路由键为队列名)。
- 【回答框架 3】消息消费可以通过 @RabbitListener 注解标注在方法上,注解中指定队列名称,Spring 会自动创建监听容器并调用该方法处理消息。需确保监听方法所在的类被 Spring 管理。
- 【回答框架 4】队列和交换机的声明可以使用 @Bean 定义 Queue、TopicExchange、FanoutExchange 等,并通过 Binding 绑定它们;也可以使用 @RabbitListener 的 bindings 属性声明。
- 【回答框架 5】在项目中还需配置连接参数,如 host、port、username、password、virtual-host,这些可以通过 application.properties 或 application.yml 进行设置,默认连接本地 RabbitMQ。
- 【关键点 1】使用 spring-boot-starter-amqp 自动配置 RabbitTemplate 和监听容器。
- 【关键点 2】RabbitTemplate.convertAndSend 用于发送消息,支持交换机和路由键。
- 【关键点 3】@RabbitListener 注解监听队列,方法需标记 @RabbitHandler 或为普通方法。
- 【关键点 4】声明队列和交换机可通过 @Bean 结合 QueueBinding 实现。
- 【关键点 5】连接参数通过配置属性设置,如 spring.rabbitmq.host 等。
- 【易错点 1】消息发送后未确认可能因事务回调未配置导致丢失,应设置 Mandatory 或 Publisher Confirms。
- 【易错点 2】队列、交换机、绑定声明不完整会导致发送或消费时资源不存在,需确保三者正确关联。
- 【易错点 3】监听方法若抛出异常,消息会重试或进入死信,需合理配置重试策略和死信队列。