2015-10-27 5 views
1

Я использую Beanstalkd (с - https://github.com/udokmeci/yii2-beanstalk) для очередей. Но мне нужно, чтобы установить пользовательские задержки для следующей попытки,Задержка произвольной задачи Beanstalkd для 2-й и 3-й попыток

первый - без задержки 2 - в час 3th - в 24 часов

Можно ли это реализовать с Beanstalkd?

public function actionCron($job) 
{ 
    $sentData = $job->getData(); 
    try { 

     // I need to setup custom delay there 
     // 1 hour after 1st retry 
     // 24 hrs after 2nd retry 

     return self::DELAY; 

    } catch (\Exception $e) { 
     //If there is anything to do. 
     fwrite(STDERR, Console::ansiFormat($e . "\n", [Console::FG_RED])); 

     // you can also bury jobs to examine later 
     return self::BURY; 
    } 
} 

ответ

0

Это вполне возможно - попросив сервер Beanstalkd для получения статистики о работе.

Из Beanstalk protocol.txt файла: возвращенного

stats-job <id>\r\n 

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

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

Поскольку вы можете попытаться получить задание из нескольких очередей, вы просто получите свой код в главной очереди, а также трубок 2-й/3-й попытки и посмотреть, что им дают, обрабатывая при необходимости.