You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:22:56