Можете ли вы опубликовать сообщение во время обработки очереди в RabbitMQ .Net Client?

У меня есть несколько сценариев обмена сообщениями. Мне нужна помощь с использованием RabbitMQ 2.1.0 в С#... 1) Я хотел бы, чтобы подписчик слушал "сырую" очередь; затем выполните некоторую предварительную обработку и опубликуйте новое сообщение, например, «предварительно обработанное» на том же обмене. 2) аналогично 1, но публикуется на другой бирже

Я заметил в руководстве пользователя клиента .Net, что в нем говорится не вызывать .basicPublish во время обратного вызова, поскольку он блокирует потоки.

using (IConnection conn = connectionFactory.CreateConnection())
{
    using (IModel model = conn.CreateModel())
    {
        var sub = new Subscription(model, "rtls");
        foreach (BasicDeliverEventArgs iter in sub)
        {
            var message = System.Text.Encoding.UTF8.GetString(iter.Body);
            //do stuff and build up a new message
            //possibly create a new connection?
            //  ***.BasicPublish(new message);

            sub.Ack(iter);
        }

    }
}

Я хотел бы успешно обработать и опубликовать новое сообщение, прежде чем отправить ack() в исходное сообщение; именно поэтому я уверен, что каждое сообщение обрабатывается.

Это правильный способ обработки или это вызовет проблемы с потоками?

Спасибо за помощь!


person csharp4me    schedule 19.10.2010    source источник


Ответы (1)


То, что вы говорите о обратных вызовах, верно, но это применимо только в том случае, если вы создаете подкласс DefaultBasicConsumer (или пишете своего собственного потребителя с нуля).

В вашем случае Subscription является потребителем и сама по себе не должна вызывать блокировки. Код, который у вас есть, в порядке, так как он использует только потребителя подписки. В этот момент BasicPublish должен быть безопасным.

Ваш код также оказывается (более или менее) нашим Подписчик.

Кроме того, извините, что не ответили на rabbitmq-discuss.

person scvalex    schedule 19.10.2010