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