【问题标题】:Consumer "received" event not firing消费者“收到”事件未触发
【发布时间】:2018-09-04 06:13:28
【问题描述】:

我正在尝试设置对 RabbitMQ 队列的订阅并将其传递给自定义事件处理程序。 所以我有一个名为RabbitMQClient 的类,其中包含以下方法:

public void Subscribe(string queueName, EventHandler<BasicDeliverEventArgs> receivedHandler)
{
    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(
                queue: queueName,
                durable: false,
                exclusive: false,
                autoDelete: false,
                arguments: null
            );

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += receivedHandler;

            channel.BasicConsume(
                queue: queueName,
                autoAck: false,
                consumer: consumer
            );
        }
    }
}

我正在使用依赖注入,所以我有一个RabbitMQClient(单例)接口。

在我的消费类中,我有这个方法,我想充当EventHandler

public void Consumer_Received(object sender, BasicDeliverEventArgs e)
{
    var message = e.Body.FromByteArray<ProgressQueueMessage>();
}

我正在尝试像这样订阅队列:

rabbitMQClient.Subscribe(Consts.RabbitMQ.ProgressQueue, Consumer_Received);

我可以看到队列开始获取消息,但 Consumer_Received 方法没有触发。

我在这里错过了什么?

【问题讨论】:

    标签: c# rabbitmq


    【解决方案1】:

    “正在使用”调用处理您的连接,您的事件不会被触发。只需从代码中删除您的“使用”块,这样它就不会关闭连接。

    var connection = factory.CreateConnection();
    
    var channel = connection.CreateModel();
    
    channel.QueueDeclare(
        queue: queueName,
        durable: false,
        exclusive: false,
        autoDelete: false,
        arguments: null);
    
    var consumer = new EventingBasicConsumer(channel);
    
    consumer.Received += receivedHandler;
    
    channel.BasicConsume(
        queue: queueName,
        autoAck: false,
        consumer: consumer);
    

    【讨论】:

    • OP 说这个类是单例的。我想保留一个静态的频道列表是个好主意。
    • 我不敢相信我没有看到...这是初学者的错误。我想我会删除这个问题,因为它是如此明显......
    • @vhr,还是很尴尬 :-)
    • @LiranFriedman 不是真的。这正是我们也有“审查”的原因。如果你写了一些东西,你可以读 1000 遍,你看不到明显的错误。让其他人阅读它,他会抓住它......毕竟我们都是人类。
    • 有趣的部分,他们的官方文档/教程显示将两者都放在 using 块中。
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多