我使用Beanstalkd(带 - https://github.com/udokmeci/yii2-beanstalk)作为队列。但我需要为下次重试设置自定义延迟,
第一 - 毫不拖延 第二 - 一小时 3日 - 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 :(得分:1)
很可能 - 向Beanstalkd服务器询问有关该工作的统计信息。
来自Beanstalk protocol.txt文件:
stats-job <id>\r\n
返回的数据包括作业先前被保留,释放的次数以及管名等的数量。您可以使用最适合的数据来根据需要对其进行重新排队。
由于您无法更改数据以延迟它,因此只创建一个新作业,一个选项是将其放入新队列进行第二次或第三次尝试,具有适当的初始延迟,然后如果作业来自重试队列(在第一次或第二次尝试之后),在再次运行之前改变初始延迟。
由于您可以尝试从多个队列中获取作业,因此您只需让代码查看主队列,也第二次/第三次尝试管,看看它们是什么给予,适当处理。