Laravel5.3 × Redisで複数のキューを扱いたかったときのメモ


実装したクラスをキューのジョブとして宣言するには

Illuminate\Contracts\Queue\ShouldQueueをimplementsしている必要がある。
なぜならhandlerShouldBeQueuedでimplementsしているかのチェックをしているからである。
基本的には下記コマンドでクラスを作成するので自前でimplementsして実装する以外は特に気にする必要はない。

php artisan make:job hoge --queued

キューのpush箇所

Illuminate\Events\Dispatcher::createQueuedHandlerCallable

キー名について

Illuminate\Queue\RedisQueue::getQueueで返却されるキーが
実際にキューで使用するキー名になる 。
デフォルトはqueues:default
設定を変えるには今のところ3パターンわかってます。
まだあったら追記予定

方法1

app\config\queue.phpのqueueをdefaultから任意のキーに変更する。
下記の設定だとqueues:hoge:fooのキー名になる。

 'redis' => [
              'driver'     => 'redis',
              'connection' => 'default',
              'queue'      => 'hoge:foo',
              'expire'     => 60,
            ],

方法2

Job側のコンストラクタでonQueueメソッドを実行し、設定を上書く。
ポイントはhandle()が呼び出される前に記述すること 。
下記の設定だとqueues:hogehogeのキー名になる。

<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
class MyJob extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->onQueue('hogehoge');
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

    } 
}

方法3

方法2に似ているがonQueueメソッド実行タイミングがちょっと違う。
ジョブ呼び出し側でJobインタンス生成時にonQueueメソッドを実行し、設定を上書く。
これだとジョブ呼び出し側で同じジョブでも違うキューに設定することが可能。