Délais limites des flux de travail
Un délai limite peut être défini pour les flux de travail. Si un flux en cours d’exécution n’est pas terminé dans la durée spécifiée, Queuety le marque comme ayant échoué et peut appeler un gestionnaire. Les flux mis en pause ou en attente d’un signal ou d’autres flux ne sont pas expirés pendant cette attente. Les délais limites sont vérifiés environ une fois par minute par un processus wp queuety work de longue durée, et non par les workers --once ou le mécanisme de secours WP-Cron. Cela sert de dispositif de sécurité pour les flux de longue durée qui ne doivent pas s’exécuter indéfiniment.
Définir un délai limite
Utilisez must_complete_within() sur le générateur de flux de travail pour définir la durée maximale autorisée. Utilisez on_deadline() pour enregistrer un gestionnaire exécuté lorsque le délai limite est dépassé.
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 ] );
La méthode must_complete_within() accepte des paramètres nommés qui sont additionnés :
->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
Gestionnaire de délai limite
La classe du gestionnaire on_deadline() doit implémenter une méthode handle( array $state ): void. Elle reçoit l’état public du flux de travail (toutes les clés qui ne commencent pas par _).
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'] );
}
}
}
Le gestionnaire de délai limite est facultatif. Si vous voulez simplement que le flux échoue sans exécuter de logique personnalisée, utilisez must_complete_within() sans on_deadline().
Fonctionnement de la vérification des délais limites
Le worker vérifie les délais limites expirés toutes les 60 secondes dans le cadre de sa boucle de traitement. Lorsqu’il trouve un flux dont status est toujours running et dont deadline_at est passée, il appelle le gestionnaire on_deadline s’il en existe un, marque le flux comme ayant échoué avec le message d’erreur Deadline exceeded et consigne un événement de journal workflow_deadline_exceeded. Le délai limite lui-même est enregistré sous forme d’horodatage deadline_at sur la ligne du flux de travail et est calculé au moment de la mise en file à partir de la durée configurée.
Conséquences de l’expiration
Lorsqu’un flux de travail dépasse son délai limite, son statut devient failed, le message d’erreur est défini sur Deadline exceeded, le gestionnaire de délai limite s’exécute de manière synchrone s’il est enregistré, et une entrée de journal workflow_deadline_exceeded est consignée. Les tâches en cours ne sont pas interrompues pendant leur exécution, mais le flux ne dépasse pas la limite de l’étape expirée. Si le gestionnaire de délai limite lève lui-même une exception, celle-ci est ignorée et le flux se termine tout de même en échec.
Méthodes de WorkflowBuilder
| Méthode | Description |
|---|---|
must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 ) |
Définit la durée maximale autorisée. Tous les paramètres sont additionnés. |
on_deadline( string $handler_class ) |
Enregistre un gestionnaire appelé lorsque le délai limite est dépassé. |
Exemple : délai limite avec nouvelle tentative
Relancer un flux de travail qui a échoué à cause de son délai limite est rarement utile. retry_workflow() le réinitialise à running et remet l’étape en échec dans la file, mais n’efface ni ne prolonge le délai limite ; la prochaine vérification, dans environ une minute, le fera donc échouer à nouveau. Lancez plutôt un nouveau flux de travail.
$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 );
}
Délai limite et pauses
Les délais limites s’appliquent à la durée totale du flux de travail. Les pauses (->delay()) suspendent le flux pendant une durée fixe, dans le cadre de sa séquence d’étapes. Un flux avec une pause d’une heure et un délai limite de deux heures échouera si les étapes hors pause prennent plus d’une heure au total.