[英]How I make a Laravel Job to fail without restarting so I can use sentry to log the exception?
[英]Laravel: How do I make a Redis queued job fail?
在 Laravel 中運行 Redis 隊列時,我無法在我的 Job 類中調用failed
方法。 我想確保我可以正確記錄它們並將它們寫入 failed_jobs 表。
關於隊列狀態的Laravel 文檔
您可以直接在您的作業類上定義一個失敗的方法,允許您在發生故障時執行特定於作業的清理。 這是向用戶發送警報或還原作業執行的任何操作的理想位置。 導致作業失敗的異常將傳遞給失敗的方法:
我不是 100% 確定 Laravel 認為什么是“導致工作失敗的異常”。 下面是一個非常簡單的作業類。 我的日志中出現的所有內容是It did not work
and exception caught
。
我正在使用以下命令啟動此隊列,特別是將tries
設置為 1,因此它不會嘗試重新運行作業。
php artisan queue:work redis --queue=widgets --tries=1
我怎樣才能調用失敗的方法並使作業出現在 failed_jobs 表中?
<?php
namespace App\Jobs;
use Exception;
use App\Processors\WidgetProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
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()
例程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.