2012-03-15 93 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();