Tutorial Laravel #27: Queue dan Job di Laravel

1. Apa itu Queue?

Queue (antrian) digunakan untuk menjalankan proses berat di background tanpa membuat user menunggu. Contoh: kirim email, generate thumbnail, proses pembayaran, export laporan, kirim notifikasi ke banyak user. Semua ini bisa dimasukkan ke queue dan diproses secara asinkron.

2. Setup Queue

# Konfigurasi di .env
QUEUE_CONNECTION=database   # pakai database sebagai driver

# Buat tabel jobs di database
php artisan queue:table
php artisan migrate

Driver queue yang tersedia: sync (langsung, untuk dev), database, redis, sqs, beanstalkd.

3. Membuat Job

php artisan make:job SendEmailJob
php artisan make:job ProcessImageJob
php artisan make:job GenerateLaporanJob
<?php
// app/Jobs/SendEmailJob.php
namespace AppJobs;

use AppModelsUser;
use AppMailWelcomeMail;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use IlluminateSupportFacadesMail;

class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    // Jumlah percobaan jika job gagal
    public int $tries = 3;

    // Timeout dalam detik
    public int $timeout = 60;

    public function __construct(public User $user) {}

    // Logika utama job
    public function handle(): void
    {
        Mail::to($this->user->email)->send(new WelcomeMail($this->user));
    }

    // Dijalankan jika job gagal setelah semua percobaan
    public function failed(Throwable $exception): void
    {
        Log::error("Gagal kirim email ke {$this->user->email}: " . $exception->getMessage());
    }
}

4. Dispatch Job ke Queue

use AppJobsSendEmailJob;

// Dispatch segera ke queue
SendEmailJob::dispatch($user);

// Dispatch dengan delay (kirim setelah 5 menit)
SendEmailJob::dispatch($user)->delay(now()->addMinutes(5));

// Dispatch ke queue spesifik
SendEmailJob::dispatch($user)->onQueue('emails');

// Dispatch hanya jika kondisi terpenuhi
SendEmailJob::dispatchIf($user->email_verified, $user);

// Dispatch sync (langsung, tidak masuk queue) - berguna untuk testing
SendEmailJob::dispatchSync($user);

5. Menjalankan Queue Worker

# Jalankan queue worker
php artisan queue:work

# Dengan konfigurasi lebih lengkap
php artisan queue:work --queue=default,emails --tries=3 --timeout=60

# Process satu job lalu berhenti (cocok untuk CRON)
php artisan queue:work --once

# Di production, pakai Supervisor agar worker tetap berjalan
# queue:listen untuk development (auto-reload saat kode berubah)
php artisan queue:listen

6. Batch Jobs

use AppJobsProcessImageJob;
use IlluminateBusBatch;
use IlluminateSupportFacadesBus;

$batch = Bus::batch([
    new ProcessImageJob($gambar1),
    new ProcessImageJob($gambar2),
    new ProcessImageJob($gambar3),
])->then(function (Batch $batch) {
    // Semua job selesai
    Log::info("Semua gambar berhasil diproses!");
})->catch(function (Batch $batch, Throwable $e) {
    // Ada job yang gagal
    Log::error("Ada gambar yang gagal diproses.");
})->dispatch();

echo "Batch ID: " . $batch->id;

7. Monitor Queue

# Lihat job yang gagal
php artisan queue:failed

# Jalankan ulang job yang gagal
php artisan queue:retry all
php artisan queue:retry 5  # retry job dengan ID 5

# Hapus semua job yang gagal
php artisan queue:flush

8. Ringkasan

  • Queue menjalankan proses berat di background tanpa mengganggu user
  • Buat job dengan php artisan make:job NamaJob dan implementasikan ShouldQueue
  • Dispatch ke queue dengan NamaJob::dispatch()
  • Jalankan worker dengan php artisan queue:work
  • Di production, gunakan Supervisor untuk memastikan worker selalu berjalan

Tutorial berikutnya membahas API Resource dan REST API dasar di Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.