Как получить IModel.BasicAcks для запуска? - PullRequest
3 голосов
/ 26 апреля 2011

Я впервые играю с .NET API RabbitMQ и нашел вариант использования, который мне кажется правдоподобным: я хочу создать издателя, который публикует сообщения и что-то делает после того, как они были подтверждены , событие IModel.BasicAcks показалось мне достойным способом узнать об этом, поэтому -

Я написал издателю:

       private static void Post(string message) {

            model.ExchangeDeclare("MyExchange", ExchangeType.Fanout, true);
            model.QueueDeclare("MyQueue", true, false, false, null);
            model.QueueBind("MyQueue", "MyExchange", "", new Dictionary<string, object>());

            byte[] messageBodyBytes = System.Text.UTF8Encoding.ASCII.GetBytes(message);
            IBasicProperties props = model.CreateBasicProperties();
            props.ContentType = "text/plain";
            props.DeliveryMode = 2;
            model.BasicPublish("MyExchange", "", props, messageBodyBytes);
    }

И подписчик:

    private static void Receive() {
            var gotten = model.BasicGet("MyQueue", false);
            var text = System.Text.UTF8Encoding.ASCII.GetString(gotten.Body);
            Console.WriteLine(text);
            model.BasicAck(gotten.DeliveryTag, false);
    }

И это точка входа для Консольного приложения:

        static void Main(string[] args) {

        connectionFactory = new ConnectionFactory();
        connectionFactory.HostName = "localhost";
        connection = connectionFactory.CreateConnection();
        model = connection.CreateModel();
        model.BasicAcks += new RabbitMQ.Client.Events.BasicAckEventHandler(model_BasicAcks);
        Post("Hello, World!");
        Receive();
        Console.ReadKey();

        connection.Dispose();
        model.Dispose();

    }

По какой-то причине мой обработчик событий не вызывается. "Привет, мир!" сообщение публикуется, читается, проверяется и выводится на консоль, но по какой-то причине обработчик событий никогда не вызывается.

Я что-то не так делаю? Подписка на IModel.ModelShutdown, похоже, работала нормально.

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

Я передам любопытный ответ, который я получил от команды RabbitMQ на этот вопрос.

Вот что они должны были сказать

Вкратце, событие запускается, но это не то, что я думал, это может быть - это для издателя подтверждает, объяснено в этом сообщении в блоге RabbitMQ

0 голосов
/ 13 августа 2013

После МНОГО экспериментов с API вот что сработало для меня.Мне нужно было объявить обработчики событий перед объявлением обмена и очередей.

_rabbitMqChannel.BasicAcks += new BasicAckEventHandler(_rabbitMqChannel_BasicAcks);
_rabbitMqChannel.BasicNacks += new BasicNackEventHandler(_rabbitMqChannel_BasicNacks);

_rabbitMqChannel.ExchangeDeclare(ExchangeName, ExchangeTypeVal.ToString());
_rabbitMqChannel.QueueDeclare(QueueName, QueueDurable, QueueExclusive, QueueDelete, null);
_rabbitMqChannel.QueueBind(QueueName, ExchangeName, RoutingKey);

и вот как будут выглядеть методы обработчиков событий ...

private void _rabbitMqChannel_BasicNacks(IModel model, BasicNackEventArgs args)
{
    throw new NotImplementedException();
}

private void _rabbitMqChannel_BasicAcks(IModel model, BasicAckEventArgs args)
{
    throw new NotImplementedException();
}

Потрачено полдня наэтот !!Надеюсь, это кому-нибудь поможет;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...