首页 > 解决方案 > Spring Cloud Stream RabbitMQ 添加队列参数

问题描述

我想知道如何向使用 spring 云流声明的 rabbitmq 队列添加额外的参数。

我想为RabbitMQ 3.8.x使用 Single Active Consumer 功能。为此,我必须在队列声明中添加一个额外的参数x-single-active-consumer
没有办法直接用spring属性进行配置。

标签: rabbitmqspring-cloudspring-rabbit

解决方案


Spring Cloud Stream 目前不支持设置任意队列参数。

请针对活页夹打开GitHub 问题以请求新功能。

Queue @Bean但是,您可以通过使用参数集向应用程序添加 a 来简单地声明队列。

或者,您可以简单地设置exclusive提供类似语义的消费者绑定器属性;竞争的消费者将定期尝试重新连接。

编辑

@SpringBootApplication
@EnableBinding(Sink.class)
public class So59011707Application {

    public static void main(String[] args) {
        SpringApplication.run(So59011707Application.class, args);
    }

    @StreamListener(Sink.INPUT)
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    Queue queue() {
        return QueueBuilder.durable("so59011707.myGroup")
                .withArgument("x-single-active-consumer", true)
                .build();
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        return args -> {
            template.convertAndSend("so59011707", "", "foo");
        };
    }

}

spring.cloud.stream.bindings.input.destination=so59011707
spring.cloud.stream.bindings.input.group=myGroup

您将在日志中看到一条错误消息

2019-11-24 10:24:22.310 错误 83004 --- [127.0.0.1:5672] osarcCachingConnectionFactory:通道关闭:通道错误;协议方法:#method(reply-code=406,reply-text=PRECONDITION_FAILED - vhost '/' 中队列 'so59011707.myGroup' 的不等价参数 'x-single-active-consumer':没有收到,但当前是值' 'bool' 类型的 true',class-id=50,method-id=10)

你可以忽略它。bindQueue或者您可以通过设置为 false 并添加Exchangeand来避免它Binding @Bean......

spring.cloud.stream.rabbit.bindings.input.consumer.bind-queue=false
@Bean
Binding binding() {
    return BindingBuilder.bind(queue())
            .to(exchange())
            .with("#");
}

@Bean
TopicExchange exchange() {
    return new TopicExchange("so59011707");
}

推荐阅读