Workflow annuleren
Workflows kunnen programmatisch of via CLI worden geannuleerd. Wanneer een workflow wordt geannuleerd, stelt Queuety de status in op cancelled, begraaft alle wachtende of verwerkende taken en voert een optionele opruimhandler uit.
Een opruimhandler registreren
Gebruik on_cancel() in de workflowbuilder om een klasse te registreren die wordt uitgevoerd wanneer de workflow wordt geannuleerd. De handlerklasse moet een methode handle( array $state ): void implementeren.
use Queuety\Queuety;
Queuety::workflow( 'import_data' )
->then( FetchDataHandler::class )
->then( TransformDataHandler::class )
->then( LoadDataHandler::class )
->on_cancel( ImportCleanupHandler::class )
->dispatch( [ 'source_url' => $url ] );
De opruimhandler ontvangt de openbare workflowstatus (alle sleutels die niet beginnen met _):
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.'
);
}
}
Annuleren via PHP
Roep Queuety::cancel_workflow() aan met de workflow-ID:
Queuety::cancel_workflow( $workflow_id );
Deze methode:
- Vergrendelt de workflowrij
- Stelt de workflowstatus in op
cancelled - Begraaft alle wachtende en verwerkende taken voor de workflow met het bericht "Workflow cancelled"
- Registreert een gebeurtenis
workflow_cancelleden voert een commit uit - Voert compensaties voor voltooide stappen in omgekeerde volgorde uit (als die zijn geregistreerd via
compensate_with()) - Voert de
on_cancel-opruimhandler uit (als die is geregistreerd)
Er wordt een RuntimeException gegooid als de workflow al completed of cancelled is.
Annuleren via CLI
wp queuety workflow cancel <id>
| Optie | Beschrijving |
|---|---|
<id> |
Workflow-ID om te annuleren (vereist) |
wp queuety workflow cancel 42
Wat gebeurt er bij annulering
Wanneer een workflow wordt geannuleerd:
- Status verandert in
cancelled - Stapcompensaties worden in omgekeerde volgorde van voltooiing uitgevoerd als je ze hebt toegevoegd met
compensate_with() - Opruimhandler wordt uitgevoerd nadat de workflowrij is gemarkeerd als
cancelled - Wachtende taken voor de workflow worden onmiddellijk begraven
- Verwerkende taken voor de workflow worden begraven; wanneer de actieve handler klaar is, wordt de uitvoer ervan verworpen en gaat de workflow niet verder
- Voltooide taken van eerdere stappen blijven ongewijzigd
- Een logboekvermelding met gebeurtenis
workflow_cancelledwordt vastgelegd
Geannuleerd versus mislukt
| Aspect | Mislukt | Geannuleerd |
|---|---|---|
| Aanleiding | Een stap verbruikt alle pogingen | Expliciete aanroep van cancel_workflow() |
| Status | failed |
cancelled |
| Opnieuw proberen | Ja, via retry_workflow(), tenzij de workflow al is gecompenseerd |
Nee |
| Opruimhandler | Wordt niet aangeroepen | Wordt aangeroepen als deze is geregistreerd via on_cancel() |
| Logboekgebeurtenis | workflow_failed |
workflow_cancelled |
Voorbeeld: annuleren met bevestiging
Een veelgebruikt patroon is de workflowstatus controleren voordat je annuleert:
$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 );
}