RabbitMQ使用AMQP PHP扩展,Queue只返回3项

时间:2013-11-21 13:32:40

标签: php rabbitmq

我是RabbitMQ的新手,我坚持这个奇怪的问题。这是我的消费者代码:

<?php
    function processMessage($envelope, $queue) 
    {
        echo $envelope->getBody() . "\n";
    }
    $routing_key = 'newTest.txt';
    $exchange_name = 'newTest.msg';
    $connection = new AMQPConnection();
    if ($connection->connect()) {
        echo "Established a connection to the broker\n";
        $ch = new AMQPChannel($connection);
        $queue = new AMQPQueue($ch);
        $queue->declare();
        try{
            if($queue->bind($exchange_name,$routing_key))
            {
                $queue->consume("processMessage");  
            }
            else
                echo "Could Not Bind";
        }
        catch (Exception $e) {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
        }
    }
    else {
        echo "Cannot connect to the broker";
    }
?>

我从命令行发布:

rabbitmqadmin publish exchange=newTest.msg routing_key=newTest.txt payload='HELLO';

当消费者正在运行时,如果我多次运行命令行发布,则队列的输出会在3个项目后停止。有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您必须在消费者中发送acknowledgereject条消息。

function processMessage($envelope, $queue) 
{
    echo $envelope->getBody() . "\n";
    $queue->ack($envelope->getDeliveryTag());
}

您还可以使用AMQP_AUTOACK自动确认所有收入消息。

            $queue->consume("processMessage", AMQP_AUTOACK);  

默认情况下,频道上的prefetch count为3,因此您会收到3封邮件,然后经纪人会等待客户端确认或拒绝邮件。

P.S。:另外,您可以在php中查看我的demo sources消费者和制作人示例。