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