😇

Laravelのキュー処理失敗を検知したい

2024/03/08に公開

キュー処理の失敗に気づけない問題

Laravelのキューを使って非同期で処理していましたが、ある時failed_jobsテーブルに失敗したジョブが積まれていた。
アラートが発生した時はslackの専用チャンネルに通知されるようにしているけど、キュー処理が失敗しても通知されない。

検知する方法

https://readouble.com/laravel/10.x/ja/queues.html#cleaning-up-after-failed-jobs
公式ドキュメントを確認したところ、キューを処理するクラスにfailedメソッドを追加してあげればいいだけみたいです。

以下が公式ドキュメントに載っていた参考コード

公式ドキュメント.php
<?php

namespace App\Jobs;

use App\Models\Podcast;
use App\Services\AudioProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Throwable;

class ProcessPodcast implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    /**
     * 新しいジョブインスタンスの生成
     */
    public function __construct(
        public Podcast $podcast,
    ) {}

    /**
     * ジョブの実行
     */
    public function handle(AudioProcessor $processor): void
    {
        // アップロードされたポッドキャストを処理…
    }

    /**
     * ジョブの失敗を処理
     */
    public function failed(Throwable $exception): void
    {
        // ユーザーへ失敗を通知するなど…
    }
}

なんて簡単なんだ、、、

実際に失敗した時にログ出力するようにしてみた所、確認することができました🎉

最後に

知っていればなんてことないけど、知らないとどうやってエラー通知を出せばいいんだってなりそうだなって感じました。
artisanコマンドで作成した時にfailedメソッドも生成されれば良くないかって思いました😇

Discussion