Rabbitmq 是否有一种方法可以为单个使用者设置两个exchange或两个队列—一个用于测试消息,另一个用于生产消息?

Rabbitmq 是否有一种方法可以为单个使用者设置两个exchange或两个队列—一个用于测试消息,另一个用于生产消息?,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我有一个要求,即在部署rabbitmq使用者组件时,如果队列上有任何消息,则在部署完成后,此使用者组件不应立即使用该消息 部署后,此组件上有健全性测试,一旦完成健全性测试,则只有此使用者组件应开始使用队列中的消息 我在使用者组件上设置了autostart=“false”,以便使用者在部署完成后不会使用消息。 完成健全性测试后,我使用rest调用启动容器侦听器 问题是,健全性测试也会在同一队列上发布消息。由于autostart=“false”,sanity test发布的消息正在队列中等待,因此s

我有一个要求,即在部署rabbitmq使用者组件时,如果队列上有任何消息,则在部署完成后,此使用者组件不应立即使用该消息

部署后,此组件上有健全性测试,一旦完成健全性测试,则只有此使用者组件应开始使用队列中的消息

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

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

当生产消息仍在队列中等待时,是否有方法可以使用健全性测试消息

@RabbitListener(id=LISTENER\u 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,
@标题(映射请求标题){
//一些代码
}

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

可以使用一个队列侦听2个交换。 也可以有两个队列监听单个交换。 RabbitMQ是关于绑定的,您需要做的就是正确绑定。请参阅下面的代码段(Spring AMQP)


通常,将维护不同的rabbitmq实例-例如:一个用于测试和生产。因此,您将得到两个不同的交换。如果要为dev&prod&2个不同的队列维护相同的exchange,也可以这样做,但不推荐这样做。无论如何,策略是使用spring概要文件,这样您就可以为dev&prod维护不同的配置。我可以知道如何做到这一点吗1.将侦听器更改为仅侦听健全队列,然后将生产队列添加到侦听器容器,。2.是否可以使用上述一种方法,我可以配置两个队列,使一个队列autostart=false,另一个队列autostart=true?
@RabbitListener
@Repeatable
的,因此最简单的解决方案是向该方法添加2个
@RabbitListener
的队列(其中一个带有
autoStartup=“false”
)。您可以在容器上使用
addQueueNames()
以编程方式执行此操作,但这要复杂一些,特别是如果您使用默认的
SimpleMessageListenerContainer
;使用
DirectMessageListenerContainer
会容易得多。
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();
    }

}