问题描述
我有一个要求,即在部署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();
}
}