Laravel Queue – 失敗任務處理

版本

Laravel 8


config/queue.php 陣列中 failed 區塊,可以設定失敗任務的連結設定。

'failed' => [
    'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
    'database' => env('DB_CONNECTION', 'mysql'),
    'table' => 'failed_jobs',
],

監聽任務時如果沒有指定任務失敗的次數,任務將會一直嘗試例請在 JOB handle 函數中增加以下程式碼

public function handle()
{
    // 領取任務後的處理程式
}

當執行的時候,將會一直不斷的嘗試執行不會停止,如果指定 --tries 次數,任務會在執行指定的次數之後刪除任務並將任務放置到失敗的任務 failed_job 資料表中,等待確認問題點後,再讓 job 重新執行,確認沒問題後可以重新執行失敗 job 的指令如下,或者可以用 crontab 定時執行。

$ php artisan queue:retry all

這下好了,如果使用者收不到應該收到的信件或其他資訊怎麼辦,我們必續嘗試監聽失敗,在失敗時通知我們立即處理,有兩種方法。

在任務Class中處理

當任務失敗的時候,在任務類別中複寫 failed 方法,對失敗的任務進行處理。

public function failed(){
    // deal with the fail job
}

第二種方法註冊在 AppServiceProvider ,但我覺得第一種比較直覺。


註冊失敗任務監聽任務

App\Providers\AppServiceProvider 這個檔案使用以下類別

use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobFailed;

然後在 boot 方法中如下設定。

Queue::failing(function(JobFailed $event){
    // deal with the fail job
});

JobFailed 類別中可以看到

/**
 * Create a new event instance.
 *
 * @param  string  $connectionName
 * @param  \Illuminate\Contracts\Queue\Job  $job
 * @param  \Throwable  $exception
 * @return void
 */
public function __construct($connectionName, $job, $exception)
{
    $this->job = $job;
    $this->exception = $exception;
    $this->connectionName = $connectionName;
}

字串 連線名稱,job 物件,還有例外資訊。可以從$job 物件中得到任務詳細資料進行處理。


如何處理失敗任務

JOB 檔案 handle只要丟出 Exception 例外, 將會進入 failed_job 資料表中並觸發 failed方法 。

public function failed(){
    // Send user notification of failure, etc...
    \Log::info(__CLASS__ . ' occurs exception: ' . $exception->getMessage());
}

如上範例紀錄LOG,或者可以如官網的註解所示,向使用者說處理失敗或者通知開發者。

情境

假設以我浪浪的事專案來看,寄送嘗試登入失敗的Mail 可能發生的原因很多種,所以要使用Log來記錄資訊,接著我會再想辦法用另外的通知方式消息給我。

給大家一個關鍵字 Notification


發佈留言