Annulation de workflow
Les workflows peuvent être annulés par programmation ou via CLI. Lorsqu’un workflow est annulé, Queuety définit son état sur cancelled, met en retrait tous les travaux en attente ou en cours de traitement et exécute un gestionnaire de nettoyage facultatif.
Enregistrer un gestionnaire de nettoyage
Utilisez on_cancel() sur le constructeur du workflow pour enregistrer une classe exécutée lors de l’annulation du workflow. Cette classe doit implémenter une méthode handle( array $state ): void.
use Queuety\Queuety;
Queuety::workflow( 'import_data' )
->then( FetchDataHandler::class )
->then( TransformDataHandler::class )
->then( LoadDataHandler::class )
->on_cancel( ImportCleanupHandler::class )
->dispatch( [ 'source_url' => $url ] );
Le gestionnaire de nettoyage reçoit l’état public du workflow (toutes les clés qui ne commencent pas par _) :
class ImportCleanupHandler {
public function handle( array $state ): void {
// Clean up any partial imports.
if ( isset( $state['temp_table'] ) ) {
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS {$state['temp_table']}" );
}
// Notify the user.
wp_mail(
$state['notify_email'] ?? '',
'Import cancelled',
'Your data import was cancelled.'
);
}
}
Annuler via PHP
Appelez Queuety::cancel_workflow() avec l’ID du workflow :
Queuety::cancel_workflow( $workflow_id );
Cette méthode :
- Verrouille la ligne du workflow
- Définit l’état du workflow sur
cancelled - Met en retrait tous les travaux en attente et en cours de traitement du workflow avec le message "Workflow cancelled"
- Enregistre un événement
workflow_cancelledet valide la transaction - Exécute les compensations des étapes terminées dans l’ordre inverse (si elles ont été enregistrées via
compensate_with()) - Exécute le gestionnaire de nettoyage
on_cancel(s’il est enregistré)
Une exception RuntimeException est levée si le workflow est déjà completed ou cancelled.
Annuler via CLI
wp queuety workflow cancel <id>
| Option | Description |
|---|---|
<id> |
ID du workflow à annuler (obligatoire) |
wp queuety workflow cancel 42
Que se passe-t-il lors d’une annulation ?
Lorsqu’un workflow est annulé :
- État passe à
cancelled - Compensations des étapes sont exécutées dans l’ordre inverse d’achèvement si vous les avez associées avec
compensate_with() - Gestionnaire de nettoyage est exécuté après que la ligne du workflow a été marquée
cancelled - Travaux en attente du workflow sont immédiatement mis en retrait
- Travaux en cours de traitement du workflow sont mis en retrait ; lorsque le gestionnaire en cours termine, son résultat est ignoré et le workflow ne progresse pas
- Travaux terminés des étapes précédentes restent inchangés
- Entrée de journal avec l’événement
workflow_cancelledest enregistrée
Annulé ou en échec
| Aspect | En échec | Annulé |
|---|---|---|
| Déclencheur | Une étape épuise ses tentatives de nouvelle tentative | Appel explicite à cancel_workflow() |
| État | failed |
cancelled |
| Nouvelle tentative possible | Oui, via retry_workflow(), sauf si le workflow a déjà été compensé |
Non |
| Gestionnaire de nettoyage | Non appelé | Appelé s’il est enregistré via on_cancel() |
| Événement de journal | workflow_failed |
workflow_cancelled |
Exemple : annulation avec confirmation
Un modèle courant consiste à vérifier l’état du workflow avant de l’annuler :
$status = Queuety::workflow_status( $workflow_id );
if ( null === $status ) {
throw new \RuntimeException( 'Workflow not found.' );
}
if ( 'running' === $status->status->value || 'paused' === $status->status->value ) {
Queuety::cancel_workflow( $workflow_id );
}