Saltar al contenido

¿Cómo pausas una cola de Laravel?

Basta ya de buscar por otros sitios porque estás al sitio perfecto, contamos con la respuesta que quieres y sin problemas.

Solución:

Puedes usar el Queue::looping() detector de eventos para pausar una cola o conexión completa (no solo una clase de trabajo individual). A diferencia de otros métodos, este no poner cada trabajo en un ciclo de pop/requeue mientras la cola está en pausa, lo que significa el número de intentos no aumentará.

Esto es lo que dicen los documentos:

Utilizando el looping método en el Queue fachada, puede especificar devoluciones de llamada que se ejecutan antes de que el trabajador intente obtener un trabajo de una cola.

https://laravel.com/docs/5.8/queues#job-events

Que es esto no documento muy bien es que si la devolución de llamada vuelve false entonces el trabajador no buscará otro trabajo. Por ejemplo, esto evitará que la default cola de ejecución:

Queue::looping(function (IlluminateQueueEventsLooping $event) 
    // $event->connectionName (e.g. "database")
    // $event->queue (e.g. "default")

    if ($event->queue == 'default') 
        return false;
    
);

Nota la queue La propiedad del evento contendrá el valor de la línea de comando cuando se inició el proceso de trabajo, por lo que si su trabajador estaba verificando más de una cola (por ejemplo, artisan queue:work --queue=high,default) entonces el valor de queue en el evento sera 'high,default'. Como precaución, es posible que desee explotar el string por comas y comprobar si default está en la lista.

Por ejemplo, si desea crear un disyuntor rudimentario para pausar el mail cola cuando su servicio de correo devuelve un error de mantenimiento, entonces puede registrar un oyente como este en su ProveedorServicioEvento.php:

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()

    parent::boot();

    Queue::looping(function (IlluminateQueueEventsLooping $event) 
        if (($event->queue == 'mail') && (cache()->get('mail-queue-paused'))) 
            return false;
        
    );

Esto supone que tiene un mecanismo en algún otro lugar de su aplicación para detectar la situación adecuada y, en este ejemplo, ese mecanismo necesitaría asignar un valor a la mail-queue-paused key en el caché compartido (porque eso es lo que mi código está buscando). Hay soluciones mucho más robustas, pero estableciendo un bien conocido key en el caché (y expirarlo automáticamente) es simple y logra el efecto deseado.

msg = $msg;
        $this->retryAfter = 10;
    

    /**
    * Execute the job.
    *
    * @return void
    */
    public function handle()
        try 
            // if we have tried sending the request and get a RemoteServerException, we will
            // redispatch the job directly and return.
            if(Cache::get(self::REMOTE_SERVER_UNAVAILABLE)) 
                self::dispatch($this->msg)->delay(Carbon::now()->addMinutes($this->retryAfter));
                return;                  
            
            // send request to remote server
            // ...
         catch (RemoteServerException $e) 
            // set a cache value expires in 10 mins if not exists.
            Cache::add(self::REMOTE_SERVER_UNAVAILABLE,'1', $this->retryAfter);
            // if the remote service undergoes a maintenance, redispatch a new delayed job.
            self::dispatch($this->msg)->delay(Carbon::now()->addMinutes($this->retryAfter));            
        
    

Sección de Reseñas y Valoraciones

Si sostienes algún dilema o capacidad de medrar nuestro crónica te recomendamos realizar una crítica y con deseo lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *