如何在Laravel中失败的排队作业尝试之间创建延迟?

时间:2016-02-07 19:41:43

标签: laravel laravel-5 laravel-5.1

我在Laravel中有一个排队的作业,由于高负载导致外部API失败,因此不时失败。问题是,我的选择似乎是让Laravel Queue继续使用请求锤击API,直到它成功或告诉它在X次请求后停止。

根据工作失败的方式,我有什么方法可以告诉它在5分钟内再试一次,而不是继续锤击?

我想使用内置的队列处理程序,但似乎没有构建重试功能来处理失败的真实场景。我认为失败工作的许多原因不会立即再次尝试解决。

3 个答案:

答案 0 :(得分:16)

你可以做的是这样的事情:

// app/Jobs/ExampleJob.php
namespace App\Jobs;

class ExampleJob extends Job
{
    use \Illuminate\Queue\InteractsWithQueue;

    public function handle()
    {
        try {
            // Do stuff that might fail
        } catch(AnException $e) {
            // Example where you might want to retry

            if ($this->attempts() < 3) {
                $delayInSeconds = 5 * 60;
                $this->release($delayInSeconds);
            }
        } catch(AnotherException $e) {
            // Example where you don't want to retry
            $this->delete();
        }
    }
}

请注意,您不必在例外情况下执行此操作,您也可以检查您的操作结果并从那里做出决定。

答案 1 :(得分:1)

您可以使用Illuminate \ Queue \ InteractsWithQueue方法手动释放作业

$this->release(10);

参数将定义作业再次可用之前的秒数。

查看版本5.1的official documentation中的手动释放作业部分。

答案 2 :(得分:0)

Laravel 5.8 +

/**
 * The number of seconds to wait before retrying the job.
 *
 * @var int
 */
public $retryAfter = 3;