2017-08-31 77 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 
     } 

    } 

}