ActiveMQ NMS使用者(C#)无法接收旧消息:我的C#程序将在接收消息的while循环中运行。
每当我需要消息并对收到的消息进行操作时,我就建立了一个NMS消费者连接。
问题是每当我启动程序时,我的程序第一次连接尝试后发布的消息,我可以下载/消费它们。
但是,如果没有消息流入并且我在建立第一个连接之前有一些旧消息,则这些消息不会被消耗掉。我使用了正确的connection.start()
。我正在使用consumer.receive(0)0 - waittime。
答案 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);
}
}
?>