tech

Table of Content

Introduction

Saya sedang mengerjakan project yg ada keperluan ngirim email ke department HR dan GA. Namun memiliki kendala ketika di pengiriman email yg agak lambat.

Queue : work

Digunakan untuk menjalankan pekerjaan dalam antrian secara manual. Ini berarti bahwa Anda harus menjalankan perintah ini secara eksplisit setiap kali ingin memproses antrian. Proses ini akan menjalankan pekerjaan yang ada dalam antrian dan kemudian mengakhiri prosesnya. Dengan kata lain, setelah semua pekerjaan dalam antrian diproses, proses tersebut akan berhenti.

Queue : listen

Menangkap antrian secara terus menerus. Artinya, setelah Anda menjalankan perintah ini, proses akan tetap berjalan dan akan terus mendengarkan antrian untuk pekerjaan baru yang masuk. Ketika ada pekerjaan baru dalam antrian, proses akan secara otomatis memprosesnya. Ini berguna untuk aplikasi yang membutuhkan pemrosesan antrian secara berkelanjutan tanpa perlu memulai ulang proses setiap kali.

Studi Kasus

Saya ingin mengirim email untuk users yg memiliki permission hr_connect_notified_in. Mungkin simplenya akan seperti ini.

$email_hr_karyawan = User::whereHas('group.permissions', function ($query) {|
	$query->where('codename', 'hr_connect_notified_in');|
})->pluck('email');
 
foreach($email_hr_karyawan as $email){
	KaryawanMasukToHR::dispatch($email, $data);
}

Kode diatas berjalan dengan baik dan aman.

Tapi… ternyata yg saya baru pelajari itu bahwa kode diatas itu tanda nya kita looping dan mengirimkan 1 email 1 jobs. bagaimana jika 1000 orang yg menerima?

Baiknya seperti ini…

$email_hr_karyawan = User::whereHas('group.permissions', function ($query) {
	$query->where('codename', 'hr_connect_notified_in');
})->select('email')
->whereNotNull('email')
->groupBy('email')
->get();
 
$to = $email_hr_karyawan->pluck('email')->toArray();
KaryawanMasukToHR::dispatch($to, $data);

di KaryawanMasukToHR

public $to;
public $data;
 
public function __construct($to, $data)
{
	$this->to = $to;
	$this->data = $data;
}
 
public function handle()
{
	Mail::to($this->to)->send(new AttachExcelToHRMail($this->data));
}

Ternyata Mail::to ini dia bisa menerima array. Jadi dengan ini kita bisa ngirim 1 mail ke beberapa orang bersangkutan dalam 1jobs. prosesnya jadi lebih cepat.

Note : gunakan queue:listen, karena proses akan tetap berjalan dan akan terus mendengarkan antrian untuk pekerjaan baru yang masuk.

Date : 29-05-24