如何在Laravel作业尝试因超时而终止时获得通知

eivnm1vs  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(143)

我创建了一个Laravel作业,尝试了3次,并在10分钟后超时。
我可以使用方法failed处理3次尝试后的失败,但是如何处理此作业每3次尝试的超时事件?
用于记录和反馈,我希望在第一次或第二次尝试失败时通知用户,并在以后重试。

class MyJob implements ShouldQueue
{
    public $tries = 3;
    public $timeout = 600;
    
    // [...]

    public function failed(Throwable $exception)
    {
        // The failure of the 3 tries.
    }

    // Any method for catching each timeouts ?
}
zwghvu4y

zwghvu4y1#

您可以在作业类上定义$failOnTimeout属性

/**
 * Indicate if the job should be marked as failed on timeout.
 *
 * @var bool
 */
public $failOnTimeout = true;

https://laravel.com/docs/9.x/queues#failing-on-timeout

iyfamqjs

iyfamqjs2#

我认为没有办法做到这一点,
但是您可以执行一些操作,例如捕获作业失败时抛出的错误,并验证它是否来自超时异常,我认为该异常将抛出异常处理程序Symfony\Component\Process\Exception\ProcessTimedOutException
比如说;

public function handle() {
    try {
        // run job
    } catch (\Throwable $exception) {   

        // manually fail it if attempt is more than twice
        if ($this->attempts() > 2)             
            $this->fail($exception);

        // Check if the error it timeout related
        if ( $exception instanceof \Symfony\Component\Process\Exception\ProcessTimedOutException ) {
            // Whatever you want to do when it fails due to timeout
        }
        
        // release the job back to queue after 5 seconds
        $this->release(5);
        return;
    }
}

只需尝试运行一个作业并确保它由于超时而失败,以验证实际的超时类异常

相关问题