2013-03-18 9 views
4

AMQP function consume() - функция блокировки с обратным вызовом, Возможно ли установить тайм-аут для функции потребления(), поэтому через определенное время он больше не блокируется и выполнение кода завершено?rabbitmq AMQP :: consumume()

ответ

5

Да, вот как:

$amqp = new AMQPConnection($your_connection_params); 
$amqp->setTimeout($seconds); 

Затем, когда вы вызываете потреблять() в очереди, если никакие сообщения не прибывают в течение периода тайм-аута, AMQPException будет выброшен из потреблять() с сообщением , «Ресурс временно недоступен». Если вы когда-либо выходите из потребления() или набираете тайм-аут, обязательно вызывайте cancel() в объекте очереди, чтобы правильно сбросить потребитель. Для того, чтобы сделать это, вам нужно создать глобально уникальный потребительский тег и передать его в качестве недокументированных, третий параметр потреблять:

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

Таким образом, вы можете позвонить потреблять() еще раз позже без странных вопросов, заставит голову вращаться.

+0

Спасибо, я попробую! – AhlyM

+1

FYI, я использую модуль pecl amqp, версия 1.0.9. Я попробовал обновление до последней версии в последнее время, и мой код полностью сломался. Но метод, описанный выше, работает правильно с amqp-1.0.9 и rabbitmq 3.1.3. – gurumike

+2

Иди в этот сценарий сегодня, и ваш ответ приведет меня в правильном направлении. Метод 'setTimeout' устарел в пользу' setReadTimeout'. Также убедитесь, что вы захватили исключение 'AMQPConnectionException', которое потребляет броски при тайм-ауте. Версия AMQP 1.4 – JohnP