Repeatable Jobs

Ci sono dei casi in cui la procedura da eseguire deve essere ripetuta nel tempo, indipendentemente dal fatto che venga completata con sucesso o meno.
Questo può essere svolto grazie a dei particolari job che prendono il nome di RepeatableJob.
Vediamo come utilizzarli tramite un esempio.

Supponiamo di voler inviare, ogni giorno alle 06:00 UTC, un report ad un determinato indirizzo email.
Avremo bisogno quindi di creare il nostro Workable che contenga la procedura per generare/inviare il report, procediamo, come visto in precedenza, ad implementare la classe Recruiter\Workable utilizzando il trait Recruiter\WorkableBehaviour per evitare di scrivere codice ridondante.
<?php

use Recruiter\Recruiter;
use Recruiter\Workable;
use Recruiter\WorkableBehaviour;

class DailyReportCommand implements Workable
{
   use WorkableBehaviour;

   public function execute()
   {
      // ...
      // here we generate the report and send it to the desired recipient
      // ...
   }
}
Ora dobbiamo far si che la nostra classe implementi anche l’interfaccia Recruiter\Repeatable in modo che possa essere schedulato automaticamente secondo un determinato schema.
<?php

use Recruiter\Recruiter;
use Recruiter\Repeatable;
use Recruiter\RepeatableBehaviour;
use Recruiter\Workable;
use Recruiter\WorkableBehaviour;

class DailyReportCommand implements Workable, Repeatable
{
   use WorkableBehaviour, RepeatableBehaviour;

   public function execute()
   {
      // ...
      // here we generate the report and send it to the desired recipient
      // ...
   }

   public function urn(): string
   {
      return 'report:daily';
   }

   public function unique(): bool
   {
      return false;
   }
}
Abbiamo quindi assegnato un nome univoco al nostro Repeatable (tramite il metodo urn()), ed indicato al Recruiter se é possibile o meno che 2 o più istanze di questo job si sovrappongano (tramite il metodo unique())
Ora che abbiamo un Repeatable vediamo come poterlo schedulare ad intervalli regolari.
Per indicare la politica di esecuzione del job dovremo utilizzare una Recruiter\SchedulePolicy
All’interno della libreria recruiter troviamo una SchedulePolicy già esistente che prende il nome di Recruiter\SchedulePolicy\Cron e permette di specificare gli intervalli di esecuzione con la stessa sintassi utilizzata dal demone unix cron.
Quindi, per inviare il nostro report ogni giorno alle 06:00 UTC dovremo fare in questo modo:
<?php

use Recruiter\Recruiter;
use Recruiter\SchedulePolicy\Cron;

$mongodbInstance = new MongoDB\Client(...);
$recruiter = new Recruiter($mongodbInstance);

$schedulePolicy = new Cron('0 6 * * *');

$scheduler = (new DailyReportCommand())
   ->asRepeatableJobOf($this->recruiter)
   ->repeatWithPolicy($schedulePolicy)
   ->retryWithPolicy(new DoNotDoItAgain()) // this is the default behaviour
   ->create()
;
Per eliminare uno scheduler attivo é possibile utilizzare il comando console scheduler:remove e seguirne le istruzioni.
$ php vendor/bin/recruiter scheduler:remove --target 127.0.0.1:27017