Срок действия Laravel Jobs

Я анализирую некоторые HTML-страницы и конечные точки API, например, каждые 5 минут, чтобы отслеживать изменения. Для этой цели я создал ParseJob, где я анализирую и сохраняю изменения в базе данных. ParseJob реализует интерфейс ShouldQueue, и я заменил драйвер очереди на Redis. Чтобы запускать ParseJob на регулярной основе, я создал ParseCommand и добавил его в расписание:

class ParseCommand extends Command
{
    protected $signature = 'application:my-parse-command';

    public function handle()
    {
        $this->dispatch(new ParseJob());
    }
}


class Kernel extends ConsoleKernel
{
    protected $commands = [
        Commands\ParseCommand::class
   ];

    protected function schedule(Schedule $schedule)
    {
           $schedule->command('application:my-parse-command')
            ->everyFiveMinutes();
    }
}

И работник очереди запускается как демон для обработки очереди. Итак, каждые 5 минут ParseJob помещается в очередь, и обработчик очереди обрабатывает задание.

Иногда рабочий процесс очереди дает сбой, зависает или по другим причинам не работает. Но задания каждые 5 минут помещаются в очередь. После часа простоя у меня в очереди 12 заданий, но они для этого времени неактуальны, потому что мне не нужно разбирать 12 раз в определенное время, я хочу только одно задание на разбор.

Итак, я хочу установить TTL для задания, которое работает как команда expire в Redis. Как это сделать? Или, может быть, у вас есть альтернативное решение?


person German Malinovsky    schedule 31.08.2017    source источник


Ответы (1)


Насколько я знаю, невозможно явно установить срок действия задания в очереди Laravel. Решением может быть установка свойства expires_at в вашем ParseJob и проверка перед выполнением:

class ParseCommand extends Command
{
    protected $signature = 'application:my-parse-command';

    public function handle()
    {
        $this->dispatch(new ParseJob(Carbon::now()->addMinutes(5)));
    }
}

затем в вашем классе работы

class ParseJob {

    protected $expires_at;

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

    public function handle() 
    {

        if(!Carbon::now()->gt($this->expires_at)) {
           // Parse data
        }

    }

}
person Desh901    schedule 31.08.2017