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

如何在Laravel中的失败排队作业尝试之间创建延迟?,laravel,laravel-5,laravel-5.1,Laravel,Laravel 5,Laravel 5.1,我在Laravel中有一个排队作业,由于高负载导致外部API失败,该作业会不时失败。问题是,我的选择似乎是让Laravel队列继续用请求敲打API,直到它成功,或者在X个请求数之后告诉它停止 根据工作失败的原因,我有没有办法告诉它5分钟后再试一次,而不是继续努力 我想使用内置的队列处理程序,但重试功能似乎不是为处理实际的失败场景而构建的。我认为很多工作失败的原因都不能通过立即再试一次来解决。你能做的是: // app/Jobs/ExampleJob.php namespace App\Jobs;

我在Laravel中有一个排队作业,由于高负载导致外部API失败,该作业会不时失败。问题是,我的选择似乎是让Laravel队列继续用请求敲打API,直到它成功,或者在X个请求数之后告诉它停止

根据工作失败的原因,我有没有办法告诉它5分钟后再试一次,而不是继续努力


我想使用内置的队列处理程序,但重试功能似乎不是为处理实际的失败场景而构建的。我认为很多工作失败的原因都不能通过立即再试一次来解决。

你能做的是:

// 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();
        }
    }
}
//app/Jobs/ExampleJob.php
名称空间App\Jobs;
类ExampleJob扩展了Job
{
使用\照明\队列\交互SwithQueue;
公共函数句柄()
{
试一试{
//做一些可能失败的事情
}捕获(异常$e){
//您可能希望重试的示例
如果($this->attempts()<3){
$delayUnseconds=5*60;
$this->release($delayUnseconds);
}
}捕获(另一个例外$e){
//不想重试的示例
$this->delete();
}
}
}

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

您可以使用Illumb\Queue\InteracticsWithQueue方法手动释放作业

$this->release(10);
参数将定义作业再次可用之前的秒数

检查版本5.1中的手动释放作业部分。

Laravel 5.8+

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

谢谢,我对释放这份工作有一个误解。另外,您在哪里找到delete()函数?这似乎没有记录在案。我希望有一种受支持的方法可以通过将作业放入failed jobs表来删除该作业。我在源代码中找到了它:关于将它们添加到failed jobs表。我不太清楚这是如何工作的,但我相信您可能必须(重新)抛出异常,以便它也由队列工作人员处理。@RojVroemen我认为我们可以通过添加
}else{throw$e;}
for
truments<3
if-statement来解决失败的_jobs表问题。因为这部分已从5.7文档中删除,这仍然是一个有效的解决方案吗?@Casper确实删除了该部分,但在(也是5.8)中仍然提到了具有持续时间的版本,所以我猜这仍然是一个有效的解决方案