Laravel: Как сделать так, чтобы работа Redis в очереди провалилась? - PullRequest
0 голосов
/ 11 июня 2018

В Laravel при запуске очередей Redis я не могу получить метод failed, вызываемый в моем классе Job.Я хочу убедиться, что я могу правильно их регистрировать и что они записаны в таблицу failed_jobs.

Документация Laravel об очередях состояния

Вы можете определитьсбойный метод непосредственно в вашем классе заданий, позволяющий выполнять очистку по заданию при возникновении сбоя.Это идеальное место для отправки оповещения вашим пользователям или отмены любых действий, выполненных заданием. Исключение, вызвавшее сбой задания, будет передано методу сбоя :

Я не на 100% уверен, что Laravel считает "исключением, вызвавшим задание"терпеть неудачу".Ниже приведен очень простой класс работы.Все, что появляется в моих журналах, это It did not work и exception caught.

. Я запускаю эту очередь следующей командой, в частности, установив tries в 1, чтобы она не пыталась повторно запуститьjob.

php artisan queue:work redis --queue=widgets --tries=1

Как получить вызов метода с ошибкой и отображение задания в таблице failed_jobs?

<?php
namespace App\Jobs;
use Exception;
use App\Processors\WidgetProcessor;

use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class WidgetJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct($widget)
    {
        $this->widget = $widget;
    }

    public function handle(WidgetProcessor $processor)
    {
        Redis::throttle('WidgetJob')->allow(5)->every(60)->then(function () use ($processor) {
            try {
                $var = false;
                if($var == false) {
                    Log::notice('It did not work');
                    throw new Exception;
                } else {
                    Log::notice('It worked');
                }
            } catch(Exception $e) {
                Log::notice('Exception caught');
            }          
        }, function () {
            return $this->release(5);
        });
    }

    public function failed(Exception $exception)
    {
        Log::notice('failed was called');
    }
}

1 Ответ

0 голосов
/ 15 июня 2018

Система Laravel Queue работает как демон, который подбирает задания, запускает их и движется дальше.Если ваша работа никогда не выдаст исключение, Laravel посчитает ее успешной.Проблема в вашем фрагменте заключается в следующем:

try {
  ... 
} catch(Exception $e) {
    Log::notice('Exception caught');
}

Улавливая исключение, вы не позволяете Laravel пометить это задание как неудачное.

У вас есть два варианта:используйте try...catch или, если вы действительно хотите его использовать, повторно сгенерируйте исключение следующим образом:

try {
  ... 
} catch(Exception $e) {
    Log::notice('Exception caught');

    throw $e;
}

Если позволить исключению всплыть, Laravel не выполнит задание и вызовет вашу процедуру failed().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...