ReceiveNoWait не работает с Apache.NMS и ActiveMQ

Я столкнулся с проблемой при использовании ReceiveNoWait с Apache.NMS и ActiveMQ, очень простые сценарии:

private static void Send(string text)
{
    var factory = new ConnectionFactory("tcp://localhost:61616/");
    using (var connection = factory.CreateConnection())
    {
        connection.Start();

        var session = connection.CreateSession();
        var queue = session.GetQueue("test");
        var producer = session.CreateProducer(queue);

        producer.Send(producer.CreateTextMessage(text));
    }
}

private static string Receive()
{
    var factory = new ConnectionFactory("tcp://localhost:61616/");
    using (var connection = factory.CreateConnection())
    {
        connection.Start();

        var session = connection.CreateSession();
        var queue = session.GetQueue("test");
        var consumer = session.CreateConsumer(queue);

        var message = (ITextMessage)consumer.ReceiveNoWait();
        return message == null ? null : message.Text;
    }
}

static void Main(string[] args)
{
    for (var i = 0; i < 100; i++)
    {
        Send(i.ToString());
    }

    while (true)
    {
        Console.WriteLine(Receive() ?? "(null)");
    }
}

Объяснение: я отправил 100 текстовых сообщений в очередь, и я собираюсь получать и печатать сообщения одно за другим с помощью цикла while. Но приведенный выше код всегда печатает (null) — я могу найти сообщения в очереди из консоли администратора.

Что не так?


person Jeffrey Zhao    schedule 27.10.2010    source источник
comment
Вы нашли ответ на это? У меня такая же проблема.   -  person Josh C.    schedule 31.05.2013


Ответы (3)


Этот метод не работает должным образом также в Apache.NMS.ActiveMQ версии 1.6.2. Обходной путь заключается в использовании эквивалентного метода IMessage Receive(TimeSpan timeout);:

var message = (ITextMessage)consumer.Receive( TimeSpan.Zero );

Хорошо бы добавить короткий тайм-аут: TimeSpan.FromMilliseconds( 100 ) должно работать.

person sgnsajgon    schedule 18.07.2014

Как долго вы ждете, пока придут сообщения? Какую версию библиотек NMS вы используете? Вы пытались добавить небольшую задержку в последний цикл while, чтобы основной поток не загружал процессор?

С уважением Тим.

http://fusesource.com

person Tim Bish    schedule 27.10.2010
comment
Я добавляю 0,5-секундную задержку после каждого вызова ‹code›Receive‹/code›, но все равно получаю тот же результат. Я использую последнюю версию 1.4.x Apache.NMS и Apache.NMS.ActiveMQ. - person Jeffrey Zhao; 28.10.2010
comment
Я бы рекомендовал вам создать тест NUnit, который воспроизводит проблемный случай, и открыть новую задачу в ActiveMQ.NET Jira. Или, по крайней мере, задайте вопрос в списках рассылки ActiveMQ. - person Tim Bish; 29.10.2010

Вы создаете потребителя, а затем напрямую вызываете receiveNoWait(). Проблема в том, что при создании потребителя сообщения отправляются потребителю асинхронно. Итак, здесь вы вызываете receiveNoWait() до того, как какое-либо сообщение будет получено потребителем (даже если они могут существовать на сервере).

Решение состоит в том, чтобы либо постоянно открывать потребителя, либо подождать некоторое время после создания потребителя, либо использовать receive(timeout)

person Morad    schedule 11.07.2019