SQSでのキューの登録に関して以前やりましたが、再度扱うことがあったので、調査を。
リンク
キューの登録
実際の登録で以前はテストと言うこともあり、route.phpで下記の用に書きましたが、実際にこんな書き方をすることはあまりありませんね。
1 2 3 4 |
Route::get('/queue', function () { Queue::push(new \App\Jobs\SampleJob()); return 'At ' . date('Y-m-d H:i:s') . ' - queue pushed.'; }); |
Controlleに下記の用に書いてJobを呼び出すことが一般的かと思われます。
app\Http\Controller\TestController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Jobs\DispatchJobs; class TestController extends Controller { public function dispatch_queue() { DispatchJob::dispatch(); } } |
おそらくdispatchの内部でQueueへの登録が起こっているのだと思われます。
app/Jobs/DispatchJobs.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Log; class DispatchJobs implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $params; /** * Create a new job instance. * * @return void */ public function __construct($values = null) { $this->params = $values; } /** * Execute the job. * * @return void */ public function handle() { $queued_at = date('Y-m-d H:i:s'); sleep(5); $dispatched_at = date('Y-m-d H:i:s'); \Log::info("処理開始 - {$queued_at} ... 処理終了 - {$dispatched_at}"); } } |
あとはControllerのメソッドに直接アクセスすればOKです。
一度Job自体をUnitテストで呼び出そうとしたのですが、
1 |
Target [Illuminate\Contracts\Bus\Dispatcher] is not instantiable. |
なるエラーが出てしまいました。
ライブラリの依存関係か?とも思いましたが、上記の用にControllerから動かすと大丈夫だったため、何らかの引数がControllerに入っていたり、Requestに依存しているのかもしれません。
キュー登録だけではなく、一般に非同期でのタスク登録などをすることをdispatch(ディスパッチ)などと言うようです。一般的には時間差をつけて登録することも一般的なようです。
キューの監視
登録されたキューの監視です。
1 |
php artisan queue:work |
以前はこれだけで覚えていましたが、
リトライ数や常駐化、スリープ時間など様々な指定をしたいときには下記の用に指定することができます。
1 |
php artisan queue:work connection --daemon --sleep=3 --tries=3 |
実際にはこのコマンド自体をsupervisordなのでデーモン化させる必要があるようです。