LoginSignup
2
3

More than 5 years have passed since last update.

Artisan::queue()でキューを指定可能にする

Last updated at Posted at 2018-03-18

Artisan::queueのキュー指定について

Laravelのジョブは以下のようにキューを指定可能ですが、

emailsキューに登録
Job::dispatch()->onQueue('emails');

Artisan::queue() ではキューの指定がなく、必ず default キューに入るようになっています。
実装を見てみると、Artisan::queue() の実体は Illuminate\Foundation\Console\Kernel::queue() で、 Illuminate\Contracts\Queue インタフェースを実装したクラスの push メソッドを実行しています。

Illuminate\Foundation\Console\Kernel
    public function queue($command, array $parameters = [])
    {
        $this->app['Illuminate\Contracts\Queue\Queue']->push(
            'Illuminate\Foundation\Console\QueuedJob', func_get_args()
        );
    }

接続を database にしている場合は、下記の実装になっています。
第3引数の $queue がデフォルトnullになっていますね。

Illuminate\Queue\DatabaseQueue
    public function push($job, $data = '', $queue = null)
    {
        return $this->pushToDatabase(0, $queue, $this->createPayload($job, $data));
    }

さらに中身を見ていくと、 $queue を指定しなかった場合は以下のメソッドで default キューに登録していました。

Illuminate\Queue\DatabaseQueue
    protected function getQueue($queue)
    {
        return $queue ?: $this->default;
    }

ということで、やはり Artisan::queue() では必ず default キューに入るようになっています。
Artisan::queue() の場合もキューを指定可能にしたい。

対応方法

App\Console\Kernel に queue メソッドを追加して、オーバーライドします。
(第3引数に $queue を追加しています)

App\Console\Kernel
    public function queue($command, array $parameters = [], $queue = null)
    {
        $this->app['Illuminate\Contracts\Queue\Queue']->push(
            'Illuminate\Foundation\Console\QueuedJob', [$command, $parameters], $queue
        );
    }

これでキューを指定可能になりました。

キューワーカ

キューワーカ起動時に --queue オプションでキューを指定します。

php artisan queue:work --queue=queue_1

複数キューがある場合は、ワーカも複数起動します。

php artisan queue:work --queue=queue_2
2
3
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
2
3