Spring Cloud Stream 2021.0.4 RabbitMQ分区功能失效问题求助
问题:Cloud Stream 2021.0.4 RabbitMQ分区抛出"Partition key cannot be null"异常
问题详情
- 升级至Cloud Stream 2021.0.4版本后,启用RabbitMQ分区功能时消息路由失败,Binder持续抛出
Partition key cannot be null异常;回滚至2021.0.3版本则功能正常,此前该功能在应用中运行稳定。 - 已尝试多种分区键表达式,均无法解决:
spring.cloud.stream.bindings.output.producer.partition-key-expression: headers['amqp_correlationId']headers['correlation_id']headers.correlation_id
代码片段分析
相关的分区键提取方法如下,可见当通过键提取器和配置的表达式都无法获取到非空值时,会触发断言抛出异常:
private Object extractKey(Message<?> message) { Object key = invokeKeyExtractor(message); if (key == null && this.producerProperties.getPartitionKeyExpression() != null) { key = this.producerProperties.getPartitionKeyExpression() .getValue(this.evaluationContext, message); } Assert.notNull(key, "Partition key cannot be null"); return key; }
可能原因及处理建议
- 版本逻辑变更:2021.0.4版本的RabbitMQ Binder可能对消息头的处理逻辑做了调整,导致原本能被正确解析的
amqp_correlationId等头信息无法通过SpEL表达式获取。 - 表达式适配调整:
- 检查发送的消息是否确实携带目标头信息,可通过日志打印消息头内容确认;
- 尝试使用更明确的表达式语法,比如
message.headers['amqp_correlationId'],或部分AMQP客户端标准的headers['x-correlation-id']。
- 临时修复与长期方案:
- 紧急情况下可回滚至2021.0.3版本恢复业务;
- 向Spring Cloud Stream官方提交问题反馈,提供复现步骤、配置及环境信息,推动问题在后续版本中修复。
内容的提问来源于stack exchange,提问作者Siva Kumar
相关产品推荐
相关产品推荐

