我使用redis为每个用户存储未处理的排队作业数。
在为用户分派作业时,在控制器中将jobNumber增加1。
Job::dispatch($job);
$redis->SET( $uid, $redis->GET($uid) + 1);
在Job handle()
函数中,当作业开始处理时,jobNumber减1。当作业失败时回滚。
public function handle()
{
...
$redis->SET( $uid, $redis->GET($uid) - 1);
...
}
public function failed(\Exception $exception)
{
...
$redis->SET( $uid, $redis->GET($uid) + 1);
\Log::info('job failed');
}
当作业第一次完成时,这项工作很顺利。但是当一个作业第一次失败并重试redis中的数字时会减少1,而不应该。
注意failed
函数仅在作业彻底失败时调用,重试时不会调用。如果有retried
函数,则failed
会更好。
那么如何在Job中捕获队列重试事件。