2015-11-26 11 views
7

Muszę utworzyć prostego menedżera kolejek, aby przekazać numer od nadawcy do konsumenta. Poradnik Hello World dostarczony przez RabbitMQ obejmuje prawie 70% tego.PHP RabbitMQ setTimeout lub inna opcja, aby przestać czekać na kolejkę

Ale muszę zmienić kolejkę, aby nie zawsze czekać na wiadomości przychodzące. Lub przestań czekać po określonej ilości wiadomości. Czytałem i wypróbowałem kilka rozwiązań z innych postów, ale to nie działa.

rabbitmq AMQP::consume() - metoda niezdefiniowana. istnieje inna metoda, wait_frame, ale jest chroniona.

i inny post jest w python, którego nie rozumiem.

<?php 

require_once __DIR__ . '/vendor/autoload.php'; 
require 'config.php'; 
use PhpAmqpLib\Connection\AMQPStreamConnection; 

function recieveQueue($queueName){ 
    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); 

    // try{ 
    // $connection->wait_frame(10); 
    // }catch(AMQPConnectionException $e){ 
    // echo "asdasd"; 
    // } 

    $channel = $connection->channel(); 

    $channel->queue_declare($queueName, false, false, false, false); 

    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n"; 

    $callback = function($msg) { 
     echo " [x] Received ", $msg->body, "\n"; 

    }; 

    // $tag = uniqid() . microtime(true); 
    // $queue->consume($callback, $flags, $tag); 

    $channel->basic_consume($queueName, '', false, true, false, false, $callback); 

    // $channel->cancel($tag); 

    while(count($channel->callbacks)) { 
     $channel->wait(); 
    } 

    echo "\nfinish"; 
} 

recieveQueue('vtiger'); 

?> 

Odpowiedz

6

Zmienić wait() w pętli while:

$timeout = 55; 
while(count($channel->callbacks)) { 
    $channel->wait(null, false, $timeout); 
} 
+0

co oznacza 'null' i 'false' oznacza? i czy mogę się dowiedzieć, czy istnieje sposób, aby przestać czekać po otrzymaniu sygnału "stop" od producenta? – jedi

+0

'public function wait ($ allowed_methods = null, $ non_blocking = false, $ timeout = 0)' – mnv

+0

Działa to tylko w przypadku korzystania ze skarpet –

0

To jak to zrobiłem, aby dać sygnał do kolejki, aby zatrzymać spożywania przychodzące wiadomości.

Jednak może to nie być właściwy sposób, ponieważ powoduje błąd, a nie wychodzi prawidłowo.

Proszę zaproponować lepszą odpowiedź, jeśli taka istnieje.

$callback = function($msg) { 
     echo " [x] Received ", $msg->body, "\n"; 

     // if queue recieve 'stop', stop consume anymore messages 
     if ($msg->body == 'stop'){ 
      $channel->basic_cancel($queueName); 
     } 
    }; 

    $channel->basic_consume($queueName, '', false, true, false, false, $callback); 

    $timeout = 10; 
    while(count($channel->callbacks)) { 
     // $channel->wait(null, false, $timeout); 
     $channel->wait(); 
    } 
5

funkcja wait działa tylko z gniazd, musimy złapać wyjątek:

$timeout = 5; 
    while (count($channel->callbacks)) { 
     try{ 
      $channel->wait(null, false , $timeout); 
     }catch(\PhpAmqpLib\Exception\AMQPTimeoutException $e){ 
      $channel->close(); 
      $connection->close(); 
      exit; 
     } 
    } 
Powiązane problemy