Spring Cloud Function实现Kafka消息投递失败及配置疑问
配置识别问题解答
你提到的两个无法被IDEA识别的配置确实已经在对应版本中废弃/更名:
spring.cloud.function.routing.enabled在Spring Cloud Function 3.1.x版本(对应Spring Cloud 2020.0.0)已经被移除,该版本默认开启函数路由能力,无需单独配置该开关spring.cloud.function.scan.packages已更名为spring.cloud.function.scan.base-packages,旧配置键在3.0版本后标记为废弃,3.1版本正式移除
消息无法发送的核心问题排查
你当前的实现存在多个配置错误,逐一修正即可解决问题:
生产者自动启动被关闭
你配置了spring.cloud.stream.bindings.articleAggregated.producer.autoStartup=false,这会导致绑定器不会初始化对应生产者的发送通道,直接删除该配置即可(默认值为true)。绑定名规则不匹配
Spring Cloud Stream 对Function类型Bean会自动生成输入、输出两个绑定,命名规则为<函数Bean名称>-in-0、<函数Bean名称>-out-0,你当前配置的绑定名articleAggregated和自动生成的绑定没有对应关系,有两种修正方案:- 方案1(推荐):给你的Function Bean指定名称
@Component("articleEventPublisher"),将配置里的绑定名统一改为articleEventPublisher-out-0,无需硬编码spring.cloud.stream.sendto.destination头 - 方案2:保留动态sendto逻辑的话,新增配置
spring.cloud.stream.dynamic-destinations=articleAggregated,允许框架动态创建目标绑定
- 方案1(推荐):给你的Function Bean指定名称
消息头被强制抹除
你配置的spring.cloud.stream.bindings.articleAggregated.producer.headerMode=none会让生产者丢弃所有消息头,包括你设置的KafkaHeaders.MESSAGE_KEY和spring.cloud.stream.sendto.destination,直接删除该配置即可(默认值为headers,会保留所有自定义头)。
额外建议
Spring Boot 2.4.0 + Spring Cloud 2020.0.0属于该大版本的初始发布版,存在大量Spring Cloud Function和Spring Cloud Stream集成的bug,如果修正完上述配置仍有问题,建议将小版本升级到Spring Boot 2.4.13、Spring Cloud 2020.0.6,这是该大版本下最后一个稳定补丁版本,修复了绝大多数已知集成问题。
内容的提问来源于stack exchange,提问作者FenderBender

