stomp-> hasFrame()返回false,队列中包含消息

时间:2012-12-20 23:29:41

标签: php activemq stomp

从ActiveMQ队列中消耗数据时遇到以下问题

使用以下代码:

$stomp = new Stomp($activeMQURI);
$stomp->subscribe($queue);
while ($stomp->hasFrame()) {

    $frame = $stomp->readFrame();

    if ($frame) {
        $stomp->ack($frame);
    }

}

在$ stomp-> hasFrame()返回false之前,它只会循环播放大约1-10条消息。问题是队列中还有10k消息!

当我在确认后延迟一切时,一切都按预期工作:

$stomp = new Stomp($activeMQURI);
$stomp->subscribe($queue);
while ($stomp->hasFrame()) {

    $frame = $stomp->readFrame();

    if ($frame) {
        $stomp->ack($frame);
        sleep(1);
    }

}

我认为发生这种情况是因为ActiveMQ服务器在消费者(我的代码)请求另一帧之前没有机会处理ack。任何人都可以解释为什么会发生这种情况的真正原因,也许是一个更好的解决方案,然后睡觉?

1 个答案:

答案 0 :(得分:0)

您没有真正指定您正在使用的客户端,所以这里是一般答案。大多数客户端提供阻塞接收呼叫,无论是定时还是无限等待,它将在消息到达时返回,或者在定时情况下指示失败。代理将消息发送到客户端的速度取决于很多因素,例如目标上的消费者数量,每个消费者设置的预取大小,以及网络的速度等等。您的代码不应该期望立即转向并且能够处理消息流量暂停的情况。这是我能给出的最佳答案,因为我不知道你的设置。