我解析一些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次,我只想要一个解析工作。
所以我想为一个像Redis中的expire命令一样工作的作业设置TTL。怎么做?或者您可能有另一种解决方案?
答案 0 :(得分: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)));
}
}
然后在你的Job类中
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
}
}
}