Spring Cloud Stream 绑定 RabbitMQ 的配置核心在于确保 YAML 中的绑定名称与 Java 代码中的函数名严格一致,并正确引入 Binder 依赖。以下配置基于 Spring Cloud Stream 3.x/4.x 函数式编程模型。
配置要点:配置分为通用绑定参数和 RabbitMQ 特有参数,前者控制消息收发逻辑,后者控制队列交换机的具体行为。
- 适用版本:Spring Cloud Stream 3.x 及以上(函数式模型)
- 关键准备:确认 Java 函数名与 YAML 中 binding 名称对应
- 验收标准:RabbitMQ 管理界面确认队列、交换机按预期创建
1. 引入依赖
确保 pom.xml 或 build.gradle 中包含 RabbitMQ Binder 依赖。以 Maven 为例:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>2. 定义绑定名称(Java 代码)
绑定名称来源于 Bean 方法名。在函数式模型中,输入通道为 方法名-in-0,输出通道为 方法名-out-0。
@Bean
public Function<String, String> process() {
return message -> {
// 处理逻辑
return "processed:" + message;
};
}上述代码对应配置文件中的 process-in-0 和 process-out-0。
3. 配置参数详解
以下 YAML 展示了通用绑定与 RabbitMQ 特有参数的组合。注意 Spring Cloud Stream 3.x+ 中消息转换通常自动处理,无需显式配置 content-type,如需自定义转换器可配置 spring.messaging.converter。
spring:
cloud:
stream:
bindings:
process-in-0:
destination: my-queue # 目标队列或交换机名
group: my-group # 消费者组,决定队列后缀
content-type: application/json # 3.x 中可选,默认通常支持 JSON
process-out-0:
destination: my-exchange
rabbit:
bindings:
process-in-0:
consumer:
auto-bind-dlq: true # 自动绑定死信队列
requeue-rejected: false # 拒绝后不重新入队
max-attempts: 3 # 重试次数
process-out-0:
producer:
routing-key-expression: headers['routingKey'] # 动态路由键4. 验证配置生效
- 启动日志:搜索
Binding created或RabbitMQ连接日志,确认无报错。 - 管理界面:登录 RabbitMQ Management,检查 Queues 列表。队列名称通常格式为
destination.group(例如my-queue.my-group)。 - 消息测试:通过界面 Publish 消息到队列,观察应用控制台是否打印处理日志。
5. 常见坑与排查
- 绑定名称不匹配:配置文件 key 必须与代码函数名生成的绑定名完全一致(区分大小写),否则配置无效。
- 消费者组缺失:若不配置
group,每个实例会创建独立匿名队列,导致消息重复消费或负载不均。 - 版本差异:旧版
@EnableBinding注解模型在 3.x 后已废弃,勿混用配置风格。 - 队列持久化:默认队列可能是持久的,如需临时队列需在 rabbit.bindings 中显式配置
durable: false。