ReceiveNoWait не работает с Apache.NMS и ActiveMQ - PullRequest
2 голосов
/ 27 октября 2010

Я столкнулся с проблемой при использовании 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) - я могу найти сообщения в очереди из консоли администратора.

Что не так?

Ответы [ 3 ]

1 голос
/ 18 июля 2014

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

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

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

0 голосов
/ 11 июля 2019

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

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

0 голосов
/ 28 октября 2010

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

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

http://fusesource.com

...