Laravel 5.1 falló los trabajos en cola falla en el método fail (), evita que se llame al controlador de eventos de falla de cola

Estoy probando las funciones de la cola en Laravel 5.1. Puedo hacer que los trabajos se pongan en cola en mi tabla db, llamados trabajos, y puedo hacer que se ejecuten con éxito. También creé una tabla de fallas en la cola llamada failure_jobs. Para probarlo, dentro de la tabla de trabajos manipulo los datos de la carga útil para que falle, luego ejecuto el demonio de trabajador de cola de esta manera, por lo que colocará el trabajo en la tabla failure_jobs después de un intento fallido:

php artisan queue:work --daemon --tries=1 --queue=myqueue

Cuando el trabajo falla, se coloca inmediatamente en la tabla failure_jobs como se esperaba.

Para su información, he configurado las cosas como recomiendan los documentos de Laravel 5.1:

http://laravel.com/docs/5.1/queues#dealing-with-failed-jobs

He intentado registrar mi evento de falla de cola en el método boot () de AppServiceProvider como se describe en los documentos:

Queue::failing(function ($connection, $job, $data) {
            Log::error('Job failed!');
        });

También probé el método fallido () dentro de los scripts de trabajo reales de esta manera:

/**
         * Handle a job failure.
         *
         * @return void
         */
        public function failed()
        {
            Log::error('failed!');
        }

De cualquier manera, ninguno de estos eventos se activa cuando falla el trabajo en cola. No veo nada en los registros, excepto el seguimiento de la pila de excepciones que hice que ocurriera a propósito. ¿Laravel 5.1 tiene un error aquí o me falta algo?

ACTUALIZAR:

He investigado un poco más. Cuando ocurre una falla en el trabajo de la cola, la lógica para manejar esa falla está en vendor / laravel / framework / src / Illuminate / Queue / Worker.php:

protected function logFailedJob($connection, Job $job)
    {
        if ($this->failer) {
            $this->failer->log($connection, $job->getQueue(), $job->getRawBody());

            $job->delete();

            $job->failed();

            $this->raiseFailedJobEvent($connection, $job);
        }

        return ['job' => $job, 'failed' => true];
    }

Lo que sucede es que la función fail () nunca se ejecuta y evita que se invoque la siguiente función, raisedFailedJobEvent (). Es como si el script se detuviera silenciosamente cuando se llama a fail (). Ahora, si invierto el orden de estas líneas, puedo hacer que se active el raiseFailedJobEvent () y si registro un controlador de eventos de cola en EventServiceProvider.php o AppServiceProvider.php, puedo verificar que se dispara y puedo manejar con éxito el evento. Desafortunadamente, haber fallado () antes de raiseFailedJobEvent () evita que este evento ocurra.

ACTUALIZAR:

El problema parece provenir de cómo lo hago fallar. Si deliberadamente corrompo los datos en la tabla de la cola de trabajos, nunca se llama al método fallido (). Hay un seguimiento de pila en los registros:

Stack trace:
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'unserialize():

Si realmente entro en vendor / laravel / framework / src / Illuminate / Queue / Worker.php y lo obligo a fallar cada vez que se ejecuta (de una manera sin excepciones, por supuesto), se llama a fail (). El problema, obviamente, es ¿cómo sé cómo se comportará esta cola en una falla del mundo real? Si los datos corruptos de db causan una falla pero evitan que se llame a fail (), esto no es bueno. ¿Qué pasa si hay una corrupción real de los datos de la cola de db en el mundo real?

Respuestas a la pregunta(2)

Su respuesta a la pregunta