laravel - Laravel:我可以在作业的句柄()中失败吗?
问题描述
我知道,如果作业抛出异常,作业将失败,并将在几秒钟内从队列工作人员自动重试。
我的问题是:我能以可控的方式失败吗?
我想捕获异常,创建更小的日志,例如,返回 false 以将作业标记为失败。
有办法吗?
精确:我不想处理失败。我想在不抛出异常的情况下挑起失败。我需要一些边缘情况,工作失败。但我也需要避免抛出异常,以避免通过哨兵和其他内部工具发出一连串警告。我只是希望一个
return false
但处理程序不希望返回值。
解决方案
如果您想处理所有失败的命令,请选择 Petay 建议的Failed作业事件。如果您想处理单个作业的失败,您可以实现该方法,就像您实现该方法一样。failed
handle
您可以直接在您的作业类上定义一个失败的方法,允许您在发生故障时执行特定于作业的清理。这是向您的用户发送警报或恢复作业执行的任何操作的理想位置。导致作业失败的异常将被传递给 failed 方法:
class ProcessPodcast implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
public function handle()
{
// Handle job and throw exception
}
public function failed(Exception $exception)
{
// Create log file
}
}
--tries
可以在调用工作人员时使用该选项将作业标记为失败。
然后,在运行队列工作程序时,您应该使用 queue:work 命令上的 --tries 开关指定应尝试作业的最大次数。如果您没有为 --tries 选项指定值,则将无限期地尝试作业:
php artisan queue:work redis --tries=3
如果您想手动触发失败,您可以抛出异常或返回状态码,如下所示:
public function handle(): int
{
if($somethingWentWrong) {
return -2;
}
return 0;
}
推荐阅读
- anylogic - 我应该使用什么类型的事件或工具来使用预先存在的数据对客户订单进行建模?
- spring - Spring 是否为每个响应添加 HSTS 标头?
- c# - 如何从可为空的类型中获取属性?
- python - 调整滑动窗口 Python 生成器函数以随机播放窗口
- javascript - 为什么 mongoose 以对象的形式返回对象 ID,ID 为 Buffer 而不是字符串?
- python - 如何以编程方式不重音熊猫数据框标头
- vhdl - VHDL:正确推断具有同步读取的单端口 RAM 的方法
- c# - how do i find the size of a file as it is being created. I need to know if the user is adding to the file currently
- apache-kafka - How do I join this table in KSQL?
- scala - 无法在 Spark 中爆炸() Map [String,Struct]