Потребитель "получил" событие, не стреляя - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь настроить подписку на очередь 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 (singleton) интерфейс для него.

В моем классе потребления у меня есть этот метод, который я хочу использовать как 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 Ответ

0 голосов
/ 04 сентября 2018

«Использование» вызовов избавиться от вашего соединения, и ваше событие не будет инициировано. Просто удалите блок «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
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...