Laravel JobでQueue IDを取得する方法
LaravelのJobを利用する際に、JobがQueueに登録されているjobs
テーブルでどのようなIDを持っているのかを知りたいと思ったことはありませんか?ありますよね?
例えば以下のケースで必要です:
- Jobの進捗管理: 実行の進捗状況(%など)をフロントエンドから確認したい => Job実行中に%を更新したい
- Jobの競合管理: データベースの状態を利用して競合を防止したい => Job実行中にstateを更新したい
本記事では、Jobの中からQueue IDを取得する方法を述べます。
問題点
シンプルなLaravelのJobではjobs
テーブルに登録されているID(Queue ID)を取得することはできません。できないのかと思ったら、InteractsWithQueue
トレイトを利用すると良いようでした。なんかInteractsWithQueue
って何のためにあるんだろう?とか思ってませんでしたか??
解決策: InteractsWithQueue
トレイトの利用
実装例
以下のコードを見てみましょう。
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;
class TrackableJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue;
/**
* Execute the job.
*/
public function handle(): void
{
// 現在のJobのQueue IDを取得
$jobId = $this->job->getJobId();
// ログ出力
Log::info('Job executed: ' . $jobId);
// ここでJobの進捗をデータベースに記録するなどの処理が可能
// Progress::update($jobId, ['status' => 'completed']);
}
}
結果
Jobが実行されると、$this->job->getJobId()
によって現在のQueue IDが取得できます。
注意点
-
Queue Driverの互換性:
-
getJobId()
はデータベースドライバーで動作することは確認しました。他のドライバーでは異なる動作になる可能性があります。
-
まとめ
InteractsWithQueue
トレイトを利用すると、LaravelのJob内でQueue IDを簡単に取得でき、進捗管理や競合管理その他諸々を実現できます。
このQueueable
トレイトはInteractsWithQueueを含んでいるので、これでも良いです。