2013-11-21 40 views
0

我是RabbitMQ的新手,並且陷入這個奇怪的問題。這是我的消費者代碼:帶有AMQP PHP擴展的RabbitMQ,隊列僅返回3個項目

<?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

你必須acknowledgereject消息在消費者。

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

此外,您可以使用AMQP_AUTOACK自動確認所有收入消息。

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

通過對信道缺省prefetch count是3,所以你收到3個消息,然後代理等待客戶機的ACK或拒絕消息。

P.S .:另外,你可以看看我的demo sources消費者和生產者的例子在PHP中。

+0

你演示的源碼就像一個魅力。非常感謝! – SNAG