有没有一种方法可以为单个使用者提供两个交换或两个队列,一个用于测试消息,另一个用于生产消息?

问题描述

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

部署之后,对该组件进行了完整性测试,一旦完成了完整性测试,则只有该使用者组件才应开始使用队列中的消息。

我在使用者组件上设置了autostart =“ false”,这样一旦部署完成,使用者就不会使用该消息。 完成完整性测试后,我将使用rest调用启动容器侦听器。

问题是健全性测试还将消息发布到同一队列中。由于自动启动=“ false”,因此由于健康测试发布的消息正在队列中,因此卫生测试失败。

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

@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

            }

解决方法

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

,

可能有一个Queue监听2个交换。 也可能有两个队列在侦听单个交换。 RabbitMQ完全是关于绑定的,您需要做的就是正确的绑定。请参见下面的代码段(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();
    }

}