关于队列删除的RabbitMQ通知

问题描述 投票:0回答:1

当我们在dotnet中的RabbitMQ上删除队列时,我们试图获得通知。 RabbitMQ的“启用rabbitmq_event_exchange”命令似乎启用了该功能。 https://www.rabbitmq.com/event-exchange.html

我们使用下面链接中的(java)示例作为.net实现的灵感。

https://github.com/rabbitmq/rabbitmq-event-exchange/blob/master/examples/java/QueueEvents.java

这是到目前为止我们实现的基本功能:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;

namespace *.QueueListener
{
    public class CustomEventingBasicConsumer : EventingBasicConsumer
    {
        public CustomEventingBasicConsumer(IModel model) : base(model)
        {
        }

        public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool 
            redelivered, string exchange, string routingKey, IBasicProperties properties, byte[] body)
        {
            Console.WriteLine(routingKey);
            base.HandleBasicDeliver(consumerTag, deliveryTag, redelivered, exchange, routingKey, 
                properties, body);
        }
    }
}

我们希望通过路由键得到通知。就像在带有if (event.equals("queue.created"))的java示例中所发生的一样,除了我自己在另一端发布的消息外,没有记录任何消息。

关于如何接收这些消息的任何想法?

((我们正在使用RabbitMQ 3.7.8)

.net rabbitmq
1个回答
1
投票

您是否已连接到amq.rabbitmq.event交换机?有关队列删除的事件在此交换上发布

可以使用ExchangeDeclarePassive连接到此交换机。

    public static void AddChannelToEventConnection()
    {
        _eventChannel = PublisherConnection.CreateModel();
        _eventChannel.ExchangeDeclarePassive("amq.rabbitmq.event");

        _eventChannel.BasicQos(0, 1, false);
        _eventConsumer = new CustomEventingBasicConsumer(_eventChannel);
    }

此后,要通知您的所有队列都需要绑定到交换机

_eventChannel.QueueBind("queue", "amq.rabbitmq.event", "queue", null);

最后,您需要创建一个自定义事件使用者

public class CustomEventingBasicConsumer : EventingBasicConsumer
{
    public CustomEventingBasicConsumer(IModel model) : base(model)
    {
    }

    public override void HandleBasicCancelOk(string consumerTag)
    {
        base.HandleBasicCancelOk(consumerTag);
    }
    public override void HandleBasicCancel(string consumerTag)
    {
        base.HandleBasicCancel(consumerTag);
    }

    public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, byte[] body)
    {
        base.HandleBasicDeliver(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body);
    }

    public override void HandleBasicConsumeOk(string consumerTag)
    {
        base.HandleBasicConsumeOk(consumerTag);
    }

}

如果在HandleBasicCancel中放置一个断点,您将看到在删除队列时,该断点将被队列的consumerTag击中

© www.soinside.com 2019 - 2024. All rights reserved.