我们有一个 Spring Boot 微服务,它不仅有 HTTP 端点,还使用 Spring Cloud Bus 来获取刷新事件(来自 Rabbit),并且还有一个 Spring Cloud Stream Sink,可以从另一个 Rabbit 主题中获取自定义消息。
更新到 Spring Boot 2.4.1 和 Spring Cloud 2020.0.0 后,一切似乎都正常,直到我们发现 Spring Cloud Bus 不再接收事件。 调查发现,一些 Spring Cloud Bus 内部通道没有被创建。
这在另一个没有流功能的服务中没有发生,因此我们测试了禁用该功能,然后总线功能开始工作。 所以这显然是旧式流模型和较新的 Spring Cloud Bus 之间的某种干扰。
更新我们的接收器以使用新的功能模型后,我仍然遇到问题,并最终通过在我们的 application.yml 中包含以下几行来使两者都能工作:
spring:
cloud:
stream:
bindings.mySink-in-0.destination: mytopic
function.definition: busConsumer;mySink
所以我有以下问题
spring.cloud.stream.function.definition
和 spring.cloud.function.definition
有什么区别?我在文档中都看到过,Spring Cloud Bus 似乎也在设置 spring.cloud.function.definition=busConsumer
在
org.springframework.cloud.stream.function.FunctionConfiguration
中,它会搜索 @EnableBinding
。
if (ObjectUtils.isEmpty(applicationContext.getBeanNamesForAnnotation(EnableBinding.class)))
如果找到,功能绑定将被禁用。看这个
logger.info("Functional binding is disabled due to the presense of @EnableBinding annotation in your configuration");
升级后,我们需要将监听器类转换为使用函数式接口,以激活函数式绑定。之后,云总线消费者绑定也会被创建。
Spring Cloud Bus 的 BusAutoConfiguration 从 3.0.0 版本开始弃用了 @EnableBinding 注解,解决了 Function 支持的问题。 可以考虑单独升级SpringCloudBus版本。