Laravel:如何让 Redis 排队作业失败?



在运行 Redis 队列时在 Laravel 中,我无法获取在我的 Job 类中调用的failed方法。我想确保我可以正确记录它们,并且它们已写入failed_jobs表。

Laravel关于队列状态的文档

您可以直接在作业类上定义失败的方法,从而允许您在发生故障时执行特定于作业的清理。这是向用户发送警报或还原作业执行的任何操作的理想位置。导致作业失败的异常将传递给失败的方法

我不是100%确定Laravel认为的"导致工作失败的异常"。下面是一个非常简单的工作类。我的日志中出现的所有内容都是It did not workexception caught

我使用以下命令启动此队列,特别是将tries设置为 1,以便它不会尝试重新运行作业。

php artisan queue:work redis --queue=widgets --tries=1

如何调用失败的方法并将作业显示在failed_jobs表中?

<?php
namespace AppJobs;
use Exception;
use AppProcessorsWidgetProcessor;
use IlluminateBusQueueable;
use IlluminateSupportFacadesLog;
use IlluminateSupportFacadesRedis;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
class WidgetJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct($widget)
{
$this->widget = $widget;
}
public function handle(WidgetProcessor $processor)
{
Redis::throttle('WidgetJob')->allow(5)->every(60)->then(function () use ($processor) {
try {
$var = false;
if($var == false) {
Log::notice('It did not work');
throw new Exception;
} else {
Log::notice('It worked');
}
} catch(Exception $e) {
Log::notice('Exception caught');
}          
}, function () {
return $this->release(5);
});
}
public function failed(Exception $exception)
{
Log::notice('failed was called');
}
}

Laravel队列系统就像一个守护进程,它拾取作业,运行它们并继续前进。如果你的工作从来没有出现过例外,Laravel会认为这是一份成功的工作。您的代码段中的问题是这样的:

try {
... 
} catch(Exception $e) {
Log::notice('Exception caught');
}

通过捕获异常,您不会让 Laravel 将此作业标记为失败。

这里有两个选择:要么不使用try...catch要么,如果你真的想使用它,请重新抛出异常,如下所示:

try {
... 
} catch(Exception $e) {
Log::notice('Exception caught');
throw $e;
}

通过让异常冒泡,Laravel将使工作失败并调用您的failed()例程。

最新更新