ActiveMQ NMS使用者在C#中的某些场景下没有收到消息

时间:2017-09-25 23:06:58

标签: c# activemq

ActiveMQ NMS使用者(C#)无法接收旧消息:我的C#程序将在接收消息的while循环中运行。

每当我需要消息并对收到的消息进行操作时,我就建立了一个NMS消费者连接。

问题是每当我启动程序时,我的程序第一次连接尝试后发布的消息,我可以下载/消费它们。

但是,如果没有消息流入并且我在建立第一个连接之前有一些旧消息,则这些消息不会被消耗掉。我使用了正确的connection.start()。我正在使用consumer.receive(0)0 - waittime。

2 个答案:

答案 0 :(得分:0)

如果您在没有超时的情况下致电消费者,您将面临无法收到消息的风险,并且必须为此做好准备。消费者不会向代理查询接收呼叫的消息,因此如果没有分派消息或者它仍然在飞行中,则接收将返回空消息。

在每次尝试获取消息时创建新连接实际上都是反模式,您应该考虑使用长期连接/消费者来避免这种情况,尽管您无法完全缓解这种情况接收(0)。

答案 1 :(得分:0)

NNS消费者示例包含以下行:

// Consume a message
ITextMessage message = consumer.Receive() as ITextMessage;

运行此代码时,可能看起来消费者正在返回null(但事实并非如此)。

问题在于,consumer.Receive()会返回IMessage,而ITextMessage并不总是ActiveMQBytesMessage。在我的情况下,它返回ITextMessage这是完全不同的类型,并将其转换为as ITextMessage中的// Consume a message IMessage message = consumer.Receive(); 返回null。

以下代码更适合作为示例:

<?php

$channels = json_decode(file_get_contents('channels.json'), true);
$day = 0;

function get_shows($channel_id, DateTime $dt, $duration=1440, $skip_finished = true) 
{
    $url = 'http://example.comapi/GS?cid=' . $channel_id . '&offset=+00.00&day=' .$day++;
    echo $url;
    $day++;
}


if(!isset($_GET['id']) || !isset($channels[$_GET['id']])) 
{
    //some random code.....
}
else
{
    // today + 6 following days
   for($day=0; $day<=6; $day++) 
   {
      // display date      
      echo '<h3>', $dt->format('Y-m-d (l)'), '</h3>';

      // display shows
      foreach(get_shows($channel_id, $dt, $duration) as $show) 
      {

      }
      $dt->add(new DateInterval('P1D'));
      $dt->setTime(0, 0, 0);
    }
}
?>