【问题标题】:stomp->hasFrame() returning false with messages in the queuestomp->hasFrame() 返回 false,队列中有消息
【发布时间】:2012-12-08 13:30:39
【问题描述】:

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

【问题讨论】:

    标签: php activemq stomp


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 2012-09-03
      • 2014-12-12
      • 2018-10-29
      • 2014-09-24
      • 1970-01-01
      • 2017-10-10
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多