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

时间:2017-08-09 05:50:06

标签: php laravel-5.2

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

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()并将错误记录到日志中?

1 个答案:

答案 0 :(得分:1)

Artisan::call实际上只是调用execute控制台类,所以如果你在其中抛出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
}