1

当使用 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。谁能解释发生这种情况的真正原因,也许比睡眠更好的解决方法?

4

1 回答 1

0

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

于 2012-12-21T15:07:10.717 回答