[英]Bind RabbitMQ consumer using Spring Cloud Stream to RabbitMQ producer
[英]Spring Cloud Stream 3 RabbitMQ consumer not working
我能够让 Spring+Rabbit 以非功能性方式工作(2.0 之前?),但我正在尝试使用功能性模式,因为前一个模式已被弃用。
未使用新方法在 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、 Supplier
或Consumer
(可以由第三方库声明),框架不知道要绑定到哪一个。
尝试将spring.cloud.function.definition
属性设置为approved
。
如果您只有一个类型为 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.