2017-08-31 64 views
0

我解析一些HTML页面和API端点,例如,每5分钟跟踪更改。为此,我创建了ParseJob,用于解析并保存对数据库的更改。 ParseJob实现了接口ShouldQueue,并且我已经将队列驱动程序更改为Redis。为了定期运行ParseJob,我已经创建ParseCommand并把它添加到时间表:Laravel Jobs过期

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

据我所知,不可能明确设置到Laravel队列的作业到期。一个解决办法是你​​内设置一个expires_at财产和执行前检查:

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 
     } 

    } 

}