簡體   English   中英

Laravel:如何使 Redis 排隊作業失敗?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM