
Como usar Queues en laravel 9

Ing. Luis Moreno
Senior Full-Stack Developer.
Al implementar este gestor de tareas podras ejecutar procesos en segundo plano evitando que tu aplicacion se relentise o evitando embudos o cuellos de botella, y a su vez controlando los procesos que requieren de mucho tiempo; pasandolos a una cola de espera y asi mantener la estabilidad del servidor e ir ejecutandolos uno por uno en una lista.
Base de datos
Empecemos creando una tabla de base de datos para gestionar nuestros procesos y lo aremos de esta manera
php artisan queue:table
con este comando creamos una nueva tabla lista para migrar a base de datos
php artisan migrate
luego en tu archivo .env deberas configurarlo asi:
QUEUE_CONNECTION=database
Creacion del trabajo:
con este comando de artisan se creara una carpeta llamada jobs y dentro creara una clase que se usara para generar la lista de procesos que queramos ir construyendo
php artisan make:job SendEmail
Ahora debemos personalizar y añadir el proceso que queremos ejecutar a nuestra clase
hay que invocar las clases respectivas que usaremos de new suscriptormail y Mail y definirlas para que no de error al usarlas
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
use App\Mail\suscriptormail;
class SendEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $details;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($details)
{
$this->details = $details;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(){
$mailable = new suscriptormail($this->details['contenido']);
Mail::to($this->details['destino'])->send($mailable);
}
}
para poder hacer esta clase de envio de correo debes entrar a este link
Recuerda que public $details; es para que nuestra clase resiba este parametro y ahora vamos a crear la ruta para poder pasarlos por nuestra clase y asi encolarlos
Route::post('/correos/enviar', function(Request $request) {
$details['destino'] = "l.a.m.v.moreno@gmail.com";
$details['contenido'] = "Hola mundo";
dispatch(new SendEmail($details));
return redirect()->back();
});
con dispatch invocamos directamente nuestra clase y podemos llamar la clase que acabamos de crear y pasarle el parametro que acabamos de definir
luego rebisas tu tabla de base de datos jobs y verificas que tengas registros
por ultimo escribes este comando para que se ejecute tu lista de procesos y se envien los correos
php artisan queue:work --timeout=60