我遇到了一个 php amqp consumer的小问题,它最近罢工了,在下面你可以看到我的 silex 命令。 我还尝试使用 heartbeat 和 keepalive 配置来处理断开的网络连接,但不奏效。Consumer不从队列中读取消息的原因是什么?脚本也没有删除,但就是不起作用。
<?php
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Knp\Command\Command as BaseCommand;
use PhpAmqpLib\Message\AMQPMessage;
class RequestWorkerCommand extends BaseCommand
{
protected function configure()
{
$this->setName('queue:worker');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$app = $this->getSilexApplication();
$amqp = $app['amqp.connection']; /* @var $amqp \PhpAmqpLib\Connection\AMQPStreamConnection */
$channel = $amqp->channel();
$callback = function($message) use ($input, $output) {
return call_user_func_array([$this, 'processMessage'], [$message, $input, $output]);
};
$channel->queue_declare('myqueue', false, true, false, false);
$channel->basic_qos(null, 1, null);
$channel->basic_consume('myqueue', '', false, false, false, false, $callback);
while(count($channel->callbacks)) {
$output->writeln('Waiting for incoming price requests');
$channel->wait();
}
}
protected function processMessage(AMQPMessage $message, InputInterface $input, OutputInterface $output)
{
$app = $this->getSilexApplication();
try {
$data = json_decode($message->body, true);
$request = Request::createFromArray($data); /* create object from data */
$message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
$app['distributor']->distribute($request); /* process message */
} catch (\Exception $e) { /* handle error */ }
}
}