繁体   English   中英

Spring 云 Stream 3 RabbitMQ 消费者不工作

[英]Spring Cloud Stream 3 RabbitMQ consumer not working

我能够让 Spring+Rabbit 以非功能性方式工作(2.0 之前?),但我正在尝试使用功能性模式,因为前一个模式已被弃用。

我一直在关注这个文档: https://docs.spring.io/spring-cloud-stream/docs/3.1.0/reference/html/spring-cloud-stream.html#_binding_and_binding_names

未使用新方法在 Rabbit 中创建队列(消费者)。 我可以看到正在创建的连接,但没有任何消费者。

在此处输入图像描述

我的 application.properties 中有以下内容:

spring.cloud.stream.function.bindings.approved-in-0=approved
spring.cloud.stream.bindings.approved.destination=myTopic.exchange
spring.cloud.stream.bindings.approved.group=myGroup.approved
spring.cloud.stream.bindings.approved.consumer.back-off-initial-interval=2000
spring.cloud.stream.rabbit.bindings.approved.consumer.queueNameGroupOnly=true
spring.cloud.stream.rabbit.bindings.approved.consumer.bindingRoutingKey=myRoutingKey

这是取代:

spring.cloud.stream.bindings.approved.destination=myTopic.exchange
spring.cloud.stream.bindings.approved.group=myGroup.approved
spring.cloud.stream.bindings.approved.consumer.back-off-initial-interval=2000
spring.cloud.stream.rabbit.bindings.approved.consumer.queueNameGroupOnly=true
spring.cloud.stream.rabbit.bindings.approved.consumer.bindingRoutingKey=myRoutingKey

和新的 class

@Slf4j
@Service
public class ApprovedReceiver {

    @Bean
    public Consumer<String> approved() {
        // I also saw that it's recommended to not use Consumer, but use Function instead
        // https://docs.spring.io/spring-cloud-stream/docs/3.1.0/reference/html/spring-cloud-stream.html#_consumer_reactive
        return value -> log.info("value: {}", value);
    }

}

这正在取代

// BindableApprovedChannel.class
@Configuration
public interface BindableApprovedChannel {
    @Input("approved")
    SubscribableChannel getApproved();
}

// ApprovedReceiver.class
@Service
@EnableBinding(BindableApprovedChannel.class)
public class ApprovedReceiver {

    @StreamListener("approved")
    public void handleMessage(String payload) {
        log.info("value: {}", payload);
    }
}

谢谢!

如果您有多个类型为Function的 beans、 SupplierConsumer (可以由第三方库声明),框架不知道要绑定到哪一个。

尝试将spring.cloud.function.definition属性设置为approved

https://docs.spring.io/spring-cloud-stream/docs/3.1.3/reference/html/spring-cloud-stream.html#spring_cloud_function

如果您只有一个类型为 java.util.function.[Supplier/Function/Consumer] 的 bean,您可以跳过 spring.cloud.function.definition 属性,因为这样的功能 bean 将被自动发现。 但是,使用此类属性以避免任何混淆被认为是最佳做法。 有时这种自动发现可能会妨碍,因为类型为 java.util.function.[Supplier/Function/Consumer] 的单个 bean 可能用于处理消息以外的目的,但作为单个它是自动发现和自动的-边界。 对于这些罕见的情况,您可以通过提供 spring.cloud.stream.function.autodetect 属性并将值设置为 false 来禁用自动发现。

加里的回答是正确的。 如果单独添加定义属性不能解决问题,我建议您分享您为供应商所做的工作。

这也是一个非常有用的一般性讨论,用于从命令式到功能性的转换,链接到 repos 以及更深入的示例: EnableBinding 在 Spring Cloud Stream 3.x 中被弃用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM