当我们在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)
您是否已连接到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击中