如何在作业失败时触发 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
}
目前我正在调用任务 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
}