ReceiveNoWait不适用于Apache.NMS& ActiveMQ的

时间:2010-10-27 10:17:01

标签: activemq

我在使用带有Apache.NMS&的ReceiveNoWait时遇到了问题。 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条短信,我将收到&amp;使用while循环逐个打印消息。但上面的代码总是打印(null) - 我可以从管理控制台中找到队列中的消息。

怎么了?

3 个答案:

答案 0 :(得分:1)

此方法在Apache.NMS.ActiveMQ版本1.6.2中也无法正常运行。解决方法是使用等效方法IMessage Receive(TimeSpan timeout);

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

添加一些短暂的超时是很好的:TimeSpan.FromMilliseconds( 100 )应该有用。

答案 1 :(得分:0)

您等待邮件到达多长时间?您使用的是哪个版本的NMS库?您是否尝试在最后的while循环中添加一个小延迟,以便主线程不会占用CPU?

此致 添

http://fusesource.com

答案 2 :(得分:0)

您正在创建使用者,然后直接调用receiveNoWait()。问题在于,当您创建使用者时,消息将异步发送到该使用者。因此,在这里,您正在致电receiveNoWait(),直到收到任何消息给使用者(即使它们可能存在于服务器上)

解决方案是让使用者一直打开,或者在创建使用者之后等待一段时间,或者使用receive(timeout)