消费者“接收”事件未触发

9
我将尝试设置一个订阅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方法没有触发。我错过了什么吗?
1个回答

24

使用 "using" 调用会在您的连接上调用 dispose,导致您的事件不会被触发。只需从代码中删除 "using" 块即可使其不关闭连接。

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说这个类是单例模式。我猜保持一个静态的频道列表会是个好主意。 - Fildor
@vhr,不过,这还是有点尴尬的 :-) - Liran Friedman
1
@LiranFriedman并不完全是这样。这也正是为什么我们有“审核”的原因。如果你写了什么东西,你可以读1000遍,但你不会看到明显的错误。让别人读一下,他就能发现...毕竟我们都是人。 - Fildor
@Fildor 说得好。 - Liran Friedman
3
有趣的部分是,他们的官方文档/教程展示了将两者都放入一个using块中。 - user1689716
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接