如何检查RabbitMQ消息队列是否存在?

0h4hbjxa  于 2022-11-23  发布在  RabbitMQ
关注(0)|答案(7)|浏览(1013)

如何检查消息队列是否已存在?
我有两个不同的应用程序,一个创建队列,另一个从该队列中读取。
因此,如果我运行客户端,首先从队列中读取,那么它会崩溃。
所以为了避免这种情况,我想先检查一下队列是否存在。
下面是我如何读取队列的代码片段:

QueueingBasicConsumer <ConsumerName> = new QueueingBasicConsumer(<ChannelName>); 
<ChannelName>.BasicConsume("<queuename>", null, <ConsumerName>); 
BasicDeliverEventArgs e = (BasicDeliverEventArgs)<ConsumerName>.Queue.Dequeue();
83qze16e

83qze16e1#

不用查了。
是一个幂等运算。所以,如果你运行它一次,两次,N次,结果仍然是一样的。
如果你想确保队列的存在性,只需在使用它之前声明它,确保你每次都用相同的持久性、独占性、自动删除性来声明它,否则你会得到一个异常。
如果你真的需要检查一个队列是否存在(通常你不需要),那么对队列做一个被动声明。如果队列存在,那么这个操作就成功,如果不存在,那么这个操作就失败。

5gfr0r5j

5gfr0r5j2#

当有其他人(其他应用程序)负责q声明时,这就不起作用了,而且我根本不可能知道q的所有参数,只知道名字。
我宁愿使用passiveDeclare并检查q不存在的IOException

vsdwdz23

vsdwdz233#

目前,您可以通过RabbitMQ Management HTTP API了解这些信息和更多信息。
例如,要知道此时是否有一个队列处于运行状态,可以调用API的GET**/api/queues/vhost/name**接口。

0ejtzxu1

0ejtzxu14#

将以下代码放在try catch节中如果队列或交换不存在,则将引发错误如果存在,则不会执行任何操作

var channel = connection.CreateModel();

  channel.ExchangeDeclarePassive(sExchangeName);

  QueueDeclareOk ok = channel.QueueDeclarePassive(sQueueName);

   if (ok.MessageCount > 0)
    {
      // Bind the queue to the exchange

     channel.QueueBind(sQueueName, sExchangeName, string.Empty);
    }
6ss1mwsb

6ss1mwsb5#

spring-amqp中有一个meta api(Java实现)

@Autowired
public RabbitAdmin rabbitAdmin;

//###############get you queue details##############
Properties properties = rabbitAdmin.getQueueProperties(queueName);

//do your custom logic
if( properties == null)
{
    createQueue(queueName);
}
kgsdhlau

kgsdhlau6#

使用队列声明()来执行此操作。此外,我们一直做的是使队列的使用者成为队列的所有者,并始终将队列发布到由发布者创建和拥有的交换机。然后,使用者将其队列绑定到他们希望从其接收通信量的交换机,并对他们希望的通信量使用适当的路由关键字过滤器。这样,对于非持久队列,发布者不被任何消费者静音,并且消费者可以自由地进出与适当路由关键字Map的持久或非持久队列。
这使得系统易于管理,并允许使用Web管理来创建持久队列并将其绑定到交换,获取一些流量,解除绑定,然后检查队列内容以了解通过交换的流量和负载。

3zwjbxry

3zwjbxry7#

依我的拙见,最好的方法是覆盖rabbitmq的默认配置。
主类应该禁用默认的rabbit配置:

@SpringBootApplication
    @EnableAutoConfiguration(exclude 
  {org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.class})
  public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

我的rabbitmq属性在rabbitmq.properties文件中:

...
    rabbitmq.queue=my-queue
...

然后就创建自己配置的rabbitmq组件:

@Component
@EnableRabbit
@PropertySource("classpath:rabbitmq.properties")
public class RabbitMQConfiguration
{
...
    @Value("${rabbitmq.queue}")
    private String queueName;

...

    @Bean
    public Queue queue() {
        return new Queue(queueName, false);
    }
...

还应设置消费者:

@Component
@PropertySource("classpath:rabbitmq.properties")
public class MyConsumer
{
    private static Logger LOG = LogManager.getLogger(MyConsumer.class.toString());

    @RabbitListener(queues = {"${rabbitmq.queue}"})
    public void receive(@Payload Object data) {
        LOG.info("Message: " + data) ;
    }

现在,当客户端启动时,如果队列不存在,它将自动创建队列如果队列存在,它将不执行任何操作

相关问题