Spring Cloud Stream RabbitMQ添加队列参数

时间:2019-11-23 20:00:46

标签: rabbitmq spring-cloud spring-rabbitmq

我想知道如何向使用Spring Cloud Stream声明的rabbitmq队列添加额外的参数。

我想对 RabbitMQ 3.8.x 使用单一活动使用者功能。为此,我必须在队列声明x-single-active-consumer中添加一个额外的参数。
无法直接使用spring属性对其进行配置。

1 个答案:

答案 0 :(得分:0)

Spring云流当前不支持设置任意队列参数。

请打开GitHub issue against the binder以请求新功能。

但是,您只需在设置了参数的应用程序中添加Queue @Bean即可声明队列。

或者,您可以简单地设置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] o.s.a.r.c.CachingConnectionFactory:通道关闭:通道错误;协议方法:#method(reply-code = 406,Reply-text = PRECONDITION_FAILED-虚拟主机'/'中队列'so59011707.myGroup'的等价arg'x-single-active-consumer':什么都没有收到,但当前值为'类型为'bool'的true”,class-id = 50,method-id = 10)

您可以忽略。或者,您可以通过将bindQueue设置为false并同时添加ExchangeBinding @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");
}