Spring Boot RabbitMQ:如何分别配置生产者与消费者(含不同主机场景)
Hey there! 作为Spring Boot + RabbitMQ的新手,完全理解你想搞清楚独立部署的生产者和消费者怎么配置的需求——毕竟在实际项目里,这俩通常都是分开跑在不同服务甚至不同主机上的。我来一步步给你拆解,从依赖、配置到代码都给你理清楚~
一、生产者(Sender)独立配置
生产者是一个单独的Spring Boot应用,负责发送消息到RabbitMQ服务器。
1. 添加依赖
首先在Maven的pom.xml里引入Spring AMQP的起步依赖(Gradle的话对应配置即可):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2. 配置RabbitMQ连接
在application.properties(或application.yml)里填写双方都能访问到的RabbitMQ服务器信息,因为是独立部署,这里不能用默认的localhost,要填RabbitMQ的实际IP:
# RabbitMQ基础连接配置 spring.rabbitmq.host=192.168.1.100 # 替换成你的RabbitMQ服务器IP spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # 可选:默认发送的交换机、路由键配置 spring.rabbitmq.template.exchange=my-demo-exchange spring.rabbitmq.template.routing-key=demo-routing-key
3. 完善生产者代码
你的Sender.java需要加上@Component让Spring扫描到,同时补全@Scheduled的定时规则,比如每秒发一条测试消息:
package ch.keko.springamqp; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class Sender { @Autowired private RabbitTemplate rabbitTemplate; // 每秒发送一条带时间戳的测试消息 @Scheduled(fixedRate = 1000) public void sendTestMessage() { String message = "Hello from independent producer! " + System.currentTimeMillis(); // 根据配置的交换机和路由键发送消息 rabbitTemplate.convertAndSend("my-demo-exchange", "demo-routing-key", message); System.out.println("✅ Sent message: " + message); } }
别忘了在生产者的启动类上加上@EnableScheduling开启定时任务:
package ch.keko.springamqp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } }
二、消费者(Receiver)独立配置
消费者也是一个单独的Spring Boot应用,负责从RabbitMQ服务器监听并消费消息。
1. 添加依赖
和生产者一样,引入Spring AMQP起步依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2. 配置RabbitMQ连接
同样在application.properties里填写和生产者完全一致的RabbitMQ服务器信息,确保能连接到同一个消息中间件:
spring.rabbitmq.host=192.168.1.100 # 和生产者用同一个RabbitMQ服务器IP spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
3. 实现消费者代码
首先创建一个配置类,定义队列、交换机和绑定关系(确保和生产者的配置完全匹配):
package ch.keko.springamqp; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { // 定义持久化队列 @Bean public Queue demoQueue() { return new Queue("demo-queue", true); // durable=true 表示队列重启不丢失 } // 定义直连交换机 @Bean public DirectExchange demoExchange() { return new DirectExchange("my-demo-exchange", true, false); } // 将队列绑定到交换机,指定路由键 @Bean public Binding demoBinding(Queue demoQueue, DirectExchange demoExchange) { return BindingBuilder.bind(demoQueue).to(demoExchange).with("demo-routing-key"); } }
然后创建消费者类,用@RabbitListener监听指定队列:
package ch.keko.springamqp; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class Receiver { // 监听名为"demo-queue"的队列 @RabbitListener(queues = "demo-queue") public void handleReceivedMessage(String message) { System.out.println("📥 Received message: " + message); // 在这里添加你的业务处理逻辑,比如入库、调用其他接口等 } }
消费者的启动类就是普通的Spring Boot启动类:
package ch.keko.springamqp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
三、关键注意事项
- RabbitMQ服务器的可访问性:如果生产者和消费者在不同主机,要确保RabbitMQ服务器开放5672端口,并且修改RabbitMQ配置允许远程连接(默认
guest用户仅允许本地访问,生产环境建议创建专用用户)。 - 配置一致性:生产者的交换机、路由键,必须和消费者绑定的交换机、路由键完全一致,否则消息会进入“死信队列”或者直接丢失。
- 持久化保障:队列、交换机设置
durable=true,消息也可以通过MessageProperties设置持久化,避免RabbitMQ重启后丢失数据。 - 异常处理:可以给消费者配置重试机制,或者添加
@RabbitHandler处理不同类型的消息,避免消费失败导致消息堆积。
内容的提问来源于stack exchange,提问作者megna

