2012-03-15 81 views
4

我AMQP擴展的版本是1.0.1 & AMQP協議的版本是0-9-1PHP獲取消息

從隊列中獲取消息:

<?php 
try { 
$conn = new AMQPConnection() ; 
$conn->setLogin('guest') ; 
$conn->setPassword('guest') ; 
$conn->connect() ; 
if ($conn->isConnected()) { 
    $channel = new AMQPChannel($conn) ; 
    if ($channel->isConnected()) 
    { 
     $queue = new AMQPQueue($channel) ; 
     $queue->setName('test_queue') ; 
     $queue->setFlags(AMQP_DURABLE | AMQP_AUTODELETE) ; 
     $queue->declare() ; 
     $messages = $queue->get(AMQP_AUTOACK) ; 
     print_r($messages->getBody()) ; 
    } 
} else { 
    echo "connect failure ... " ; 
} 
$conn->disconnect() ;} catch (Exception $e) { 
echo $e->getMessage() ;}?> 

,它不工作。 。

Server channel error: 406, message: PRECONDITION_FAILED - parameters for queue 'test_queue' in vhost '/' not equivalent 

回答

8

在我看來,該隊列已經存在,它被宣佈(創建)之前與虛擬主機不同的參數。隊列需要每次都使用相同的參數完全聲明(或者用所需的參數刪除和重新創建)。嘗試通過管理插件(http://www.rabbitmq.com/management.html)刪除隊列,然後再次運行腳本

1

如果您的隊列已創建,則不需要創建它(使用'聲明'方法)並再次與交換綁定。恕我直言,你不應該這樣做:a)這些行爲需要管理權限; b)僅對它一次就足夠了; c)你可能沒有獲得生產的管理權限,並且你的代碼將被破壞。 我認爲最好是用管理控制檯或任何你喜歡的工具創建和綁定所有需要的隊列,然後用這種方式接收消息

// consider using connection more than once. that's only for illustration purposes. 
$connection = new AMQPConnection([ put your credentials here ]); 
$connection->connect(); 
if(!$connection->isConnected()) { 
    throw new Exception('Connection failed.'); 
} 

$chnlObj = new AMQPChannel($connection); 
$queObj = new AMQPQueue($chnlObj); 
$queObj->setName('yourQueueName'); 
echo $queObj->get(AMQP_AUTOACK)->getBody(); 

// consider using connection more than once. that's only for illustration purposes. 
$connection->disconnect();