【问题标题】:Is there a way to have two exchange or two queue for the single consumer one for testing message and another for production message?有没有办法让单个消费者有两个交换或两个队列,一个用于测试消息,另一个用于生产消息?
【发布时间】:2020-09-10 17:08:45
【问题描述】:

我有一个要求,在部署rabbitmq消费者组件时,如果队列上有任何消息,那么一旦部署完成,这个消费者组件不应该立即消费消息。

部署后对此组件进行健全性测试,一旦健全性测试完成,那么只有这个消费者组件应该开始消费队列中的消息。

我在消费者组件上设置了 autostart = "false",这样消费者就不会在部署完成后消费消息。 健全性测试完成后,我使用 rest 调用启动容器侦听器。

问题是健全性测试也在同一个队列上发布消息。由于 autostart = "false",sanity test 发布的消息正在队列中等待,因此 Sanit 测试失败。

有没有办法在生产消息仍在队列中等待但可以使用健全性测试消息时?

@RabbitListener(id = LISTENER_ID,
            bindings = @QueueBinding(exchange = @Exchange(value = "${listener.exchange}", type = "topic"),
                    value = @Queue(value = "${listener.queue}", durable = "true"), key = "${listener.routingKey}"),
            containerFactory = "rabbitListenerContainerFactory",  autoStartup = "false" )
    public void receiveMessage(@Valid @Payload RequestMessage requestMessage,
            @Headers Map<String, Object> requestHeaders) {

            //some code

            }

【问题讨论】:

  • 一般情况下,会维护不同的rabbitmq 实例——例如:一个用于测试和生产..所以,您将获得2 个不同的交换。如果您想为 dev & prod & 2 个不同的队列保持相同的交换,这也是可能的,但不推荐。无论如何,策略是使用 spring 配置文件,因此您可以为 dev 和 prod 维护不同的配置

标签: rabbitmq spring-amqp spring-rabbit


【解决方案1】:

您必须使用 2 个队列和 2 个侦听器(或将侦听器更改为仅侦听健全队列,然后将生产队列添加到侦听器容器)。

【讨论】:

  • 请问我该怎么做? - 1. 将侦听器更改为仅侦听健全队列,然后将生产队列添加到侦听器容器中。 2.是否可以使用上述一种方法,我可以配置两个队列,使一个队列autostart = false,另一个队列autostart = true?
  • @RabbitListener@Repeatable 所以最简单的解决方案是在方法中添加 2 个@RabbitListeners(一个带有autoStartup="false")。您可以在容器上使用addQueueNames() 以编程方式执行此操作,但这有点复杂,特别是如果您使用默认的SimpleMessageListenerContainer;使用DirectMessageListenerContainer 会容易得多。
【解决方案2】:

可以让一个队列监听 2 个交换。 也可以有两个队列监听一个交换。 RabbitMQ 是关于绑定的,你需要做的就是正确的绑定。请参阅下面的 sn-p (Spring AMQP)。

package com.savk.workout.spring.rabbitmqconversendreceivefanoutproducer;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AmqpConfig {

    private final String PREFIX = "savk-sndandrcv-fanout";
    private final String RK = PREFIX + "-" + "rk";
    private final String EXCHANGE = PREFIX + "-" + "exchange";
    private final String QUEUE = System.getenv("INSTANCE");    //PREFIX + "-" + "queue";

    @Bean
    public Exchange exchange()  {
        return ExchangeBuilder.fanoutExchange(EXCHANGE).autoDelete().build();
    }

    @Bean
    public Queue queue()    {
        return QueueBuilder.nonDurable(QUEUE).autoDelete().build();
    }

    @Bean
    public Queue queue2()    {
        return QueueBuilder.nonDurable(QUEUE).autoDelete().build();
    }

    @Bean
    public Binding binding1(Exchange exchange)    {
        return BindingBuilder.bind(queue()).to(exchange).with(RK).noargs();
    }

    @Bean
    public Binding binding2(Exchange exchange)    {
        return BindingBuilder.bind(queue2()).to(exchange).with(RK).noargs();
    }

}

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2014-04-19
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多