Workflowdeadlines
Je kunt een deadline instellen voor workflows. Als een actieve workflow niet binnen de opgegeven tijd is voltooid, markeert Queuety deze als mislukt en roept eventueel een handler aan. Workflows die zijn gepauzeerd of wachten op een signaal of andere workflows, verlopen niet terwijl ze wachten. Deadlines worden ongeveer eens per minuut gecontroleerd door een langlopend proces wp queuety work, niet door --once-workers of de terugvaloptie WP-Cron. Dit fungeert als een dodemansknop voor langlopende workflows die niet eindeloos mogen doorlopen.
Een deadline instellen
Gebruik must_complete_within() in de workflowbuilder om de maximaal toegestane duur in te stellen. Gebruik on_deadline() om een handler te registreren die wordt uitgevoerd wanneer de deadline wordt overschreden.
use Queuety\Queuety;
Queuety::workflow( 'data_import' )
->then( FetchDataHandler::class )
->then( TransformDataHandler::class )
->then( LoadDataHandler::class )
->must_complete_within( hours: 24 )
->on_deadline( ImportTimeoutHandler::class )
->dispatch( [ 'source' => $url ] );
De methode must_complete_within() accepteert benoemde parameters die bij elkaar worden opgeteld:
->must_complete_within( hours: 2, minutes: 30 ) // 2.5 hours
->must_complete_within( days: 1 ) // 24 hours
->must_complete_within( seconds: 3600 ) // 1 hour
->must_complete_within( days: 1, hours: 12 ) // 36 hours
Deadlinehandler
De handlerklasse on_deadline() moet een methode handle( array $state ): void implementeren. Deze ontvangt de openbare workflowstatus (alle sleutels die niet beginnen met _).
class ImportTimeoutHandler {
public function handle( array $state ): void {
// Alert the team.
wp_mail(
'ops@example.com',
'Import workflow timed out',
'Workflow for source ' . ( $state['source'] ?? 'unknown' ) . ' exceeded its deadline.'
);
// Clean up partial work.
if ( isset( $state['temp_file'] ) ) {
unlink( $state['temp_file'] );
}
}
}
De deadlinehandler is optioneel. Als je alleen wilt dat de workflow mislukt zonder aangepaste logica uit te voeren, gebruik je must_complete_within() zonder on_deadline().
Hoe deadlinecontrole werkt
De worker controleert elke 60 seconden op verlopen deadlines als onderdeel van de verwerkingslus. Wanneer deze een workflow vindt waarvan status nog steeds running is en waarvan deadline_at in het verleden ligt, roept deze de handler on_deadline aan als die is geregistreerd, markeert de workflow als mislukt met het foutbericht Deadline exceeded en registreert een logboekgebeurtenis workflow_deadline_exceeded. De deadline zelf wordt opgeslagen als een tijdstempel deadline_at op de workflowrij en wordt bij verzending berekend op basis van de ingestelde duur.
Wat gebeurt er bij het verlopen
Wanneer een workflow de deadline overschrijdt, verandert de status in failed, wordt het foutbericht ingesteld op Deadline exceeded, wordt de deadlinehandler synchroon uitgevoerd als die is geregistreerd en wordt een logboekvermelding workflow_deadline_exceeded vastgelegd. Taken die worden uitgevoerd, worden niet halverwege onderbroken, maar de workflow gaat niet verder dan de grens van de verlopen stap. Als de deadlinehandler zelf een uitzondering gooit, wordt die stilzwijgend opgevangen en eindigt de workflow alsnog als mislukt.
Methoden van WorkflowBuilder
| Methode | Beschrijving |
|---|---|
must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 ) |
Stelt de maximaal toegestane duur in. Alle parameters worden opgeteld. |
on_deadline( string $handler_class ) |
Registreert een handler die wordt aangeroepen wanneer de deadline wordt overschreden. |
Voorbeeld: deadline met nieuwe poging
Opnieuw proberen met een workflow die door de deadline is mislukt, is zelden nuttig. retry_workflow() zet de status terug naar running en zet de mislukte stap opnieuw in de wachtrij, maar wist of verlengt de deadline niet. De volgende deadlinecontrole, binnen ongeveer een minuut, laat de workflow dus opnieuw mislukken. Verzend in plaats daarvan een nieuwe workflow.
$status = Queuety::workflow_status( $workflow_id );
if ( 'failed' === $status->status->value ) {
// Check if it was a deadline failure.
// You may want to dispatch a new workflow instead of retrying.
Queuety::retry_workflow( $workflow_id );
}
Deadline versus slaapvertragingen
Deadlines gelden voor de volledige workflowduur. Slaapvertragingen (->delay()) pauzeren de workflow gedurende een vaste tijd als onderdeel van de stappenreeks. Een workflow met een slaapvertraging van 1 hour en een deadline van 2 hours mislukt als de niet-slaapstappen in totaal meer dan 1 hour duren.