如何在作业失败时触发 laravel jobs failed() 方法?

How to trigger laravel jobs failed() method when job fails?

目前我正在调用任务 Report.php 并使用 generateReport() 方法生成报告。我已检查作业是否已使用 CLI 命令 php artsan queue:listen 执行。如果在调用 Artisan::call() 时出现任何问题,错误消息将显示在终端中。所以我想在 failed() 中捕获异常,并将错误记录到日志中。 我在 handle() 方法中尝试使用 try catch 但它没有捕获异常。

protected $options;
public function __construct($options)
{
    $this->options = array_merge(
        [
            'task'  => 'Report',
            'do'    => 'generateReport',
            'limit' => '10000'
        ],
        $options
    );

}
public function handle()
{
    Artisan::call('execute', [
        '--task'        => $this->options['task'],
        '--do'          => $this->options['do'],
        '--parameters'  => $this->options,

    ]);

}

public function failed()
{
    //
}

如何触发 failed() 并将错误写入日志?

Artisan::call 实际上只是调用 execute 控制台 class 所以如果你在里面扔一个 Exception 它应该自动结束在 failed方法。

但是,在 5.2 中,Exception 对象未传递给失败的方法(这是在 5.3 中添加的)。

Laravel 5.2

因此,如果您需要将 Exception 对象传递给 failed 方法,那么您需要在 5.2:

中执行类似的操作
public function handle()
{
    try {
      Artisan::call('execute', [
        '--task'        => $this->options['task'],
        '--do'          => $this->options['do'],
        '--parameters'  => $this->options,            
      ]);
    } catch (\Exception $e) {
      $this->failed($e)
    }
}

public function failed(\Exception $e = null)
{
    //handle error
}

Laravel 5.3+

5.3 中,Exception 会自动传递给 failed,因此您的代码将如下所示:

public function handle()
{
    Artisan::call('execute', [
      '--task'        => $this->options['task'],
      '--do'          => $this->options['do'],
      '--parameters'  => $this->options,            
    ]);
}

public function failed(\Exception $e = null)
{
    //handle error
}