
# Darbo eigos atšaukimas

Darbo eigas galima atšaukti programiškai arba per CLI. Atšaukus darbo eigą, Queuety nustato jos būseną į `cancelled`, perkelia visas laukiančias arba apdorojamas užduotis į paslėptų užduočių saugyklą ir paleidžia pasirenkamą valymo apdorojimo programą.

## Valymo apdorojimo programos registravimas

Naudokite `on_cancel()` darbo eigos kūrimo priemonėje, kad užregistruotumėte klasę, kuri vykdoma atšaukus darbo eigą. Apdorojimo programos klasė turi įgyvendinti metodą `handle( array $state ): void`.

```php
use Queuety\Queuety;

Queuety::workflow( 'import_data' )
    ->then( FetchDataHandler::class )
    ->then( TransformDataHandler::class )
    ->then( LoadDataHandler::class )
    ->on_cancel( ImportCleanupHandler::class )
    ->dispatch( [ 'source_url' => $url ] );
```

Valymo apdorojimo programa gauna viešąją darbo eigos būseną (visus raktus, kurie neprasideda `_`):

```php
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.'
        );
    }
}
```

## Atšaukimas per PHP

Iškvieskite `Queuety::cancel_workflow()` ir nurodykite darbo eigos ID:

```php
Queuety::cancel_workflow( $workflow_id );
```

Šis metodas:

1. Užrakina darbo eigos eilutę
2. Nustato darbo eigos būseną į `cancelled`
3. Perkelia visas laukiančias ir apdorojamas darbo eigos užduotis į paslėptų užduočių saugyklą su pranešimu "Darbo eiga atšaukta"
4. Užregistruoja įvykį `workflow_cancelled` ir patvirtina operaciją
5. Atvirkštine tvarka vykdo užbaigtų žingsnių kompensavimo veiksmus (jei jie užregistruoti per `compensate_with()`)
6. Paleidžia `on_cancel` valymo apdorojimo programą (jei ji užregistruota)

Išmetama `RuntimeException` klaida, jei darbo eiga jau yra `completed` arba `cancelled`.

## Atšaukimas per CLI

```bash
wp queuety workflow cancel <id>
```

| Parinktis | Aprašymas |
|---|---|
| `<id>` | Atšaukiamos darbo eigos ID (privaloma) |

```bash
wp queuety workflow cancel 42
```

## Kas nutinka atšaukus

Atšaukus darbo eigą:

- **Būsena** pakeičiama į `cancelled`
- **Žingsnių kompensavimo veiksmai** vykdomi atvirkštine užbaigimo tvarka, jei juos pridėjote per `compensate_with()`
- **Valymo apdorojimo programa** paleidžiama pažymėjus darbo eigos eilutę būsena `cancelled`
- **Laukiančios užduotys** darbo eigai iškart perkeliamos į paslėptų užduočių saugyklą
- **Apdorojamos užduotys** perkeliamos į paslėptų užduočių saugyklą; baigus vykdyti apdorojimo programą, jos rezultatas atmetamas ir darbo eiga netęsiama
- **Užbaigtos užduotys** iš ankstesnių žingsnių paliekamos nepakeistos
- **Žurnalo įrašas** su įvykiu `workflow_cancelled` įrašomas

## Atšaukta ir nepavykusi eiga

| Aspektas | Nepavykusi | Atšaukta |
|---|---|---|
| Paleidiklis | Žingsnis išnaudoja pakartotinių bandymų skaičių | Aiškus `cancel_workflow()` iškvietimas |
| Būsena | `failed` | `cancelled` |
| Galima pakartoti | Taip, per `retry_workflow()`, nebent darbo eigos kompensavimo veiksmai jau atlikti | Ne |
| Valymo apdorojimo programa | Nekviečiama | Kviečiama, jei užregistruota per `on_cancel()` |
| Žurnalo įvykis | `workflow_failed` | `workflow_cancelled` |

## Pavyzdys: atšaukimas su patvirtinimu

Dažnas šablonas – prieš atšaukiant patikrinti darbo eigos būseną:

```php
$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 );
}
```
