【问题标题】:ReceiveNoWait doesn't work with Apache.NMS & ActiveMQReceiveNoWait 不适用于 Apache.NMS 和 ActiveMQ
【发布时间】:2019-07-11 18:42:10
【问题描述】:

在将 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) - 我可以从管理控制台找到队列中的消息。

怎么了?

【问题讨论】:

  • 您找到答案了吗?我也有同样的问题。

标签: activemq


【解决方案1】:

此方法在Apache.NMS.ActiveMQ 版本1.6.2 中也不能正常工作。解决方法是使用等效方法IMessage Receive(TimeSpan timeout);:

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

最好添加一些短超时:TimeSpan.FromMilliseconds( 100 ) 应该可以工作。

【讨论】:

    【解决方案2】:

    您要等多长时间才能收到消息?您使用的是什么版本的 NMS 库?您是否尝试过在最后的 while 循环中添加一个小延迟,以便主线程不会占用 CPU?

    问候 蒂姆。

    http://fusesource.com

    【讨论】:

    • 我在每次 Receive 调用后添加了 0.5 秒的延迟,但仍然得到相同的结果。我正在使用最新的 1.4.x 版本的 Apache.NMS 和 Apache.NMS.ActiveMQ。
    • 我建议您创建一个 NUnit 测试来重现问题案例并在 ActiveMQ.NET Jira 上打开一个新问题。或者至少将问题提交给 ActiveMQ 邮件列表。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 2019-11-13
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 2011-06-27
      • 1970-01-01
      • 2015-10-27
      相关资源
      最近更新 更多