использование EasyNetQ multiple Handler для одного потребителя не работает

Мы используем RabbitMQ для постановки сообщений в очередь в C # .Net (EasyNetQ Client).

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

Я реализовал этот сценарий, и мой код здесь:

using (var advancedBus = RabbitHutch.CreateBus("host=localhost;prefetchcount=100")
                                    .Advanced)
{
    var queue = advancedBus.QueueDeclare("MyQueue");

    advancedBus.Consume(queue, x => x
               .Add<MessageType1>((message, info) =>
               {
                  Console.WriteLine("MessageType1 Body : " + message.Body.Body);
               })
               .Add<MessageType2>((message, info) => 
               {
                  Console.WriteLine(" MessageType2 Body: " + message.Body.Body);
               }).ThrowOnNoMatchingHandler = false);
}

Моя проблема: но когда я выполняю этого потребителя, он ничего не делает. ничего не происходит.

я публикую сообщения в эту очередь следующим образом:

using (var advancedBus = RabbitHutch.CreateBus("host=localhost").Advanced)
{
    var queue = advancedBus.QueueDeclare("MyQueue");

    if (advancedBus.IsConnected)
        advancedBus.Publish(Exchange.GetDefault(), queue.Name, false, false,
            new Message<MessageType1>(change));
    else
        result = false;
}

В чем проблема.


person Javad Norouzi    schedule 14.07.2015    source источник
comment
advancedBus.IsConnected проваливается? Вы вообще можете подключиться к кролику?   -  person Yuval Itzchakov    schedule 14.07.2015
comment
Спасибо за комментарий, да. это связано. когда я подписываюсь на определенный тип сообщения, он работает отлично, но в моем сценарии с луком это не работает.   -  person Javad Norouzi    schedule 14.07.2015


Ответы (1)


Хорошо, после тестирования этого кода проблемы следующие:

Прежде всего, вы выбрасываете свой advancedBus сразу после регистрации для потребления. Вы должны помнить, что когда вы вызываете IAdvanceBus.Consume, вы регистрируете обратный вызов только для каждого сообщения. Если вы выбрасываете шину сразу после регистрации, ваш делегат не может быть вызван, поскольку соединение уже было закрыто. Итак, вы удалите оператор using вокруг объявления кролика (не забудьте удалить его, когда закончите):

var advancedBus = RabbitHutch.CreateBus("host=localhost;prefetchcount=100").Advanced

Во-вторых, флаг immediate устарел. и не должно использоваться, сообщение, похоже, не попадает в очередь. Измените Publish на:

advancedBus.Publish(Exchange.GetDefault(), queue.Name, true, false,
                    new Message<MessageType1>(change));

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

Вот пример рабочего кода:

static void Main()
{
    var change = new MessageType1();
    var advancedBus = RabbitHutch.CreateBus("host=localhost").Advanced;

    ConsumeMessage(advancedBus);

    var queue = advancedBus.QueueDeclare("MyQueue");
    if (advancedBus.IsConnected)
    {
        advancedBus.Publish(Exchange.GetDefault(), queue.Name, true, false,
            new Message<MessageType1>(change));
    }
    else
    {
        Console.WriteLine("Can't connect");
    }

    Console.ReadKey();
}

private static void ConsumeMessage(IAdvancedBus advancedBus)
{
    var queue = advancedBus.QueueDeclare("MyQueue");
    advancedBus.Consume(queue, registration =>
    {
        registration.Add<MessageType1>((message, info) =>
        {
            Console.WriteLine("Body: {0}", message.Body);
        });
    });
}
person Yuval Itzchakov    schedule 14.07.2015
comment
Спасибо дорогой Юваль, это решило мою проблему. Утилизация была моей проблемой. - person Javad Norouzi; 14.07.2015