1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel Jobのhandle内からQueue IDを取得する方法

Last updated at Posted at 2024-12-10

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を含んでいるので、これでも良いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?