Membuat Report Untuk Job Queue Laravel Yang Sudah Dijalankan
Sebelumnya kita sudah mempelajari tentang Job Queue Laravel, mulai dari cara pembuatan nya, cara menjalankan nya di local, sampai gimana cara menjalankan nya di hosting.
Silahkan buka: Pandungan Lengkap Job Queue Laravel.
Nah untuk kali ini, kita tidak lagi membahas tentang job queue nya, tapi kita akan membahas gimana cara membuat report untuk setiap job queue yang sudah dijalankan.
Tujuan nya agar kita bisa melihat histori dari setiap job queue nya, nanti akan ada status nya juga, apakah masih menunggu, sedang di proses, gagal, atau sudah selesai di proses.
Membuat Report Untuk Job Queue Laravel Yang Sudah Dijalankan
Kalau kalian menggunakan driver queue nya “database“, sebetulnya kalian bisa melihat job apa yang sedang atau akan diproses oleh sistem melalui table “job“.
Cuma yang jadi masalah nya, ketika job queue tersebut sudah selesai di proses, maka datanya akan hilang dari table tersebut.
Oleh karena nya kita perlu menyimpan nya secara manual kedalam table lain yang akan kita buat sendiri.
Membuat Table “job_reports”
Anggap saja nama table yang akan kita buat yaitu “job_reports” yang akan kita gunakan untuk menampung setiap job queue yang dijalankan.
Kita buat Model dan Migration nya dengan menjalankan perintah berikut:
.... php artisan make:model JobReport -m ....
Kemudian buka file migration nya, buat struktur nya seperti berikut:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateJobReportsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('job_reports', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('user_id')->nullable(); $table->string('type')->nullable(); $table->string('status')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('job_reports'); } }
Diatas hanya contoh sederhana dari struktur table nya, kalian bisa menambahkan lagi beberapa field yang memang dibutuhkan sesuai dengan kebutuhan masing-masing.
Setelah itu tinggal jalankan perintah:
.... php artisan migrate ....
Maka table nya akan terbentuk seperti berikut:
Sesuai dengan yang dibuat pada file migration nya.
Membuat Data Report nya
Setelah table nya terbentuk, sekarang kita mulai isi data-data report nya.
Setiap data yang di create, nanti akan terdapat 4 status:
- waiting: ini artinya job tersebut masih menunggu untuk di eksekusi, masih dalam list antrian nya.
- processing: job queue nya sedang di eksekusi.
- success: job nya telah selesai dan berhasil di eksekusi.
- failed: job nya gagal atau terdapat error saat di eksekusi.
Membuat Data Dengan Status waiting
Data yang akan pertama kali terbentuk pastinya adalah data dengan status waiting.
Data ini kita create berbarengan saat kita men-dispatch job nya, contoh nya adalah seperti berikut:
.... Route::get('call-job', function () { $job_report = JobReport::create([ 'user_id' => Auth::id(), 'type' => 'test_job', 'status' => 'waiting' ]); CahayaJob::dispatch($job_report->id); }); ....
Pada kode diatas, dibaris ke-3 kita membuat query create data kedalam table job_reports.
.... $job_report = JobReport::create([ 'user_id' => Auth::id(), 'type' => 'test_job', 'status' => 'waiting' ]); ....
Kemudian pada baris ke-9, kita men-dispatch job nya dengan membawa parameter id dari data job_reports yang barusan di create.
.... CahayaJob::dispatch($job_report->id); ....
Kenapa kita membawa job report id nya? Tujuan nya agar bisa melakukan update status terhadap data report tersebut.
Update Status Ke Success, Failed, atau Processing
Karena tadi kita sudah membawa id dari job_reports nya, maka didalem file job nya, perlu kita modifikasi seperti berikut ini, buka file “../jobs/CahayaJob.php”:
<?php namespace App\Jobs; use App\Models\JobReport; use Throwable; use App\Models\User; use Faker\Factory as Faker; use Illuminate\Support\Str; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Contracts\Queue\ShouldBeUnique; class CahayaJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ protected $job_report_id; public function __construct($job_report_id) { $this->job_report_id = $job_report_id; } /** * Execute the job. * * @return void */ public function handle() { JobReport::find($this->job_report_id)->update([ 'status' => 'processing' ]); $faker = Faker::create('id_ID'); for ($i = 1; $i <= 100; $i++) { User::create([ 'name' => $faker->name(), 'email' => $faker->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10) ]); } JobReport::find($this->job_report_id)->update([ 'status' => 'success' ]); } public function failed(Throwable $exception): void { JobReport::find($this->job_report_id)->update([ 'status' => 'failed' ]); // Send user notification of failure, etc... } }
Pada baris ke-27 sampai ke-32, kita menangkap parameter id nya dan memasukkan nya kedalam property “$job_report_id“.
.... protected $job_report_id; public function __construct($job_report_id) { $this->job_report_id = $job_report_id; } ....
Pada baris ke-41, kita update status job report nya menjadi processing, ini menandakan bahwa job nya sedang di eksekusi.
.... JobReport::find($this->job_report_id)->update([ 'status' => 'processing' ]); ....
Kemudian pada baris ke-57, jika job nya sudah selesai di eksekusi, kita update status nya menjadi success.
.... JobReport::find($this->job_report_id)->update([ 'status' => 'success' ]); ....
Tapi jika ternyata job nya gagal, maka akan masuk kedalam method failed(), dan didalam method tersebut kita mengubah status report nya menjadi failed.
.... public function failed(Throwable $exception): void { JobReport::find($this->job_report_id)->update([ 'status' => 'failed' ]); } ....
Sekarang kalo file job nya dipanggil, maka akan menambah record baru didalam table “job_reports” seperti berikut ini:
Dan ketika sedang dijalankan atau sudah berhasil dijalankan, maka status nya akan berubah menjadi seperti berikut:
Selanjutnya tinggal kamu panggil saja data nya dan kamu tampilkan di UI nya agar user juga dapat memantau setiap job yang berjalan.
Support Us
Jika artikel ini bermanfaat untuk kamu, atau membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid
[…] Untuk cara pembuatan nya bisa kunjungi halaman berikut: Membuat Report Untuk Job Queue. […]