Como usar Queues en laravel 9

Como usar Queues en laravel 9

luilliWeb

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

         
     



Comentar