接收NOWAIT不';t使用Apache.NMS&;ActiveMQ

接收NOWAIT不';t使用Apache.NMS&;ActiveMQ,activemq,Activemq,我在Apache.NMS和ActiveMQ中使用ReceiveNoWait时遇到问题,非常简单的场景: private static void Send(string text) { var factory = new ConnectionFactory("tcp://localhost:61616/"); using (var connection = factory.CreateConnection()) { connection.Start();

我在Apache.NMS和ActiveMQ中使用ReceiveNoWait时遇到问题,非常简单的场景:

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)");
    }
}
私有静态无效发送(字符串文本)
{
变量工厂=新连接工厂(“tcp://localhost:61616/");
使用(var connection=factory.CreateConnection())
{
connection.Start();
var session=connection.CreateSession();
var queue=session.GetQueue(“测试”);
var producer=session.CreateProducer(队列);
producer.Send(producer.CreateTextMessage(text));
}
}
私有静态字符串接收()
{
变量工厂=新连接工厂(“tcp://localhost:61616/");
使用(var connection=factory.CreateConnection())
{
connection.Start();
var session=connection.CreateSession();
var queue=session.GetQueue(“测试”);
var consumer=session.CreateConsumer(队列);
var message=(ITextMessage)consumer.ReceiveNoWait();
返回消息==null?null:message.Text;
}
}
静态void Main(字符串[]参数)
{
对于(变量i=0;i<100;i++)
{
Send(i.ToString());
}
while(true)
{
Console.WriteLine(接收()??“(空)”;
}
}
说明:我向队列发送了100条短信,我将使用while循环逐个接收并打印这些短信。但是上面的代码总是打印
(null)
-我可以从管理控制台找到队列中的消息


怎么了?

您要等多长时间才能收到邮件?您正在使用哪个版本的NMS库?您是否尝试过在最后的while循环中添加一个小的延迟,这样主线程就不会占用CPU

问候 蒂姆


此方法在
Apache.NMS.ActiveMQ
版本
1.6.2
中也不能正常工作。解决方法是使用等效方法
IMessage接收(TimeSpan超时)


最好添加一些短超时:
TimeSpan。从毫秒(100)
开始应该可以工作。

您正在创建一个消费者,然后直接调用
receiveNoWait()
。问题在于,当您创建消费者时,消息会异步发送给消费者。因此,在消费者收到任何消息之前(即使它们可能存在于服务器上),您正在调用
receiveNoWait()


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

我在每次
receive
呼叫后添加了0.5秒的延迟,但仍然得到相同的结果。我使用的是Apache.NMS和Apache.NMS.ActiveMQ的最新1.4.x版本。我建议您创建一个NUnit测试,以再现问题案例,并在ActiveMQ.NET Jira上打开一个新问题。或者至少把这个问题带到ActiveMQ邮件列表。你找到答案了吗?我也有同样的问题。
var message = (ITextMessage)consumer.Receive( TimeSpan.Zero );