版本
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