Я анализирую некоторые 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. Как это сделать? Или, может быть, у вас есть альтернативное решение?