PHP RabbitMQ setTimeout или другой параметр, чтобы остановить ожидание очереди

Мне необходимо создать простой диспетчер очереди, чтобы передать число от отправителя к потребителю. Учебное пособие Hello World, предоставленное RabbitMQ, охватывает почти 70%.

Но мне нужно изменить очередь, чтобы не ждать вечно входящих сообщений. Или перестаньте ждать после определенного количества сообщений. Я прочитал и попробовал несколько решений из другого поста, но это не работает.

rabbitmq AMQP :: потребление () — неопределенный метод. есть другой метод, wait_frame, но он защищен.

и другой пост в Python, который я не понимаю.

<?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');

?>

9

Решение

Измените wait () в цикле while:

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

Другие решения

функция ожидания работает только с сокетами, мы должны поймать исключение:

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

Вот как я сделал, чтобы дать сигнал очереди прекратить потребление входящих сообщений.

Однако это может быть неправильным способом сделать это, поскольку он выдает ошибку, а не выходит правильно.

Пожалуйста, предложите лучший ответ, если таковой имеется.

    $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();
}
0
По вопросам рекламы [email protected]