2016-04-08 36 views
0

Burada bir süre sonra çalışmayı bırakan bir php amqp tüketici ile küçük bir sorun var. Aşağıda silex komutumu görebilirsiniz. Ayrıca kırık ağ bağlantılarını ele almak için kalp atışı ve kalıcı yapılandırma ile çalıştım, ancak değişmiyor. Tüketicinin sıradaki mesajları okumadığının bir nedeni ne olabilir? Script çalışmıyor, sadece uyuyor gibi görünüyor.PHP AMQP tüketici bir süre sonra cevap vermiyor

<?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 */ } 
    } 
} 

cevap

0

PHP'den emin olamıyorum ama Python/kombu ile benzer bir sorunla karşılaştım. Saf puython amqplib, bunu yapmak için direktifler vermiş olmama rağmen asla kalp atışı yapmadı. Bir yedek olarak librabbitmq'i (tavşanmq-c etrafında sarar) değiştirdiğimde, kalp atımları bir sorun olmayacaktı ve tüketicilerim benim üzerimde durdu.

+0

Geç cevap için özür dilerim. Kalp atışlarını phpamqp-lib ile kullanmaya çalıştım ama beklendiği gibi çalışmıyor. Şimdi bağlantı zaman aşımı ile deneyin, ama bu aynı zamanda zombi bağlantıları gibi bazı yan etkileri vardır. Süreç yönetimi için denetleyici kullanıyorum ve bir çalışan ölürse yeni süreçleri başlatır. Bağlantılar hala rabbitmq üzerinde yaşıyor !? – Daniel