
# Munkafolyamat megszakítása

A munkafolyamatok programozottan vagy a(z) CLI segítségével szakíthatók meg. Megszakításkor a(z) Queuety a(z) `cancelled` értékre állítja az állapotát, eltemeti a függőben lévő vagy feldolgozás alatt álló feladatokat, és futtat egy választható takarító kezelőt.

## Regisztrációs takarító kezelő

Használja a `on_cancel()` metódust a munkafolyamat-építőn egy olyan osztály regisztrálásához, amely a munkafolyamat megszakításakor fut le. A kezelőosztálynak implementálnia kell egy `handle( array $state ): void` metódust.

```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 ] );
```

A takarító kezelő megkapja a munkafolyamat nyilvános állapotát (az összes olyan kulcsot, amely nem `_` kezdetű):

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

## Megszakítás a PHP használatával

Hívja meg a `Queuety::cancel_workflow()` metódust a munkafolyamat azonosítójával:

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

Ez a metódus:

1. Zárolja a munkafolyamat sorát
2. Beállítja a munkafolyamat állapotát erre: `cancelled`
3. Eltemeti a munkafolyamathoz tartozó összes függőben lévő és feldolgozás alatt álló feladatot a "Workflow cancelled" üzenettel
4. Naplóz egy `workflow_cancelled` eseményt, majd véglegesíti a tranzakciót
5. Fordított sorrendben futtatja a befejezett lépések kompenzációit (ha a `compensate_with()` használatával regisztráltak ilyet)
6. Futtatja a `on_cancel` takarító kezelőt (ha regisztráltak ilyet)

`RuntimeException` kivétel keletkezik, ha a munkafolyamat már `completed` vagy `cancelled` állapotú.

## Megszakítás a CLI használatával

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

| Beállítás | Leírás |
|---|---|
| `<id>` | Megszakítandó munkafolyamat-azonosító (kötelező) |

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

## Mi történik megszakításkor

Amikor egy munkafolyamatot megszakítanak:

- **Állapot**: `cancelled` értékre változik
- **Lépéskompenzációk**: fordított befejezési sorrendben futnak le, ha a `compensate_with()` segítségével csatolta őket
- **Takarító kezelő**: a munkafolyamat `cancelled` állapotúra jelölése után fut le
- **Függőben lévő feladatok**: a munkafolyamathoz tartozók azonnal eltemetésre kerülnek
- **Feldolgozás alatt álló feladatok**: a munkafolyamathoz tartozók eltemetésre kerülnek; a folyamatban lévő kezelő befejezésekor a kimenete eldobásra kerül, és a munkafolyamat nem lép tovább
- **Befejezett feladatok**: a korábbi lépések feladatai változatlanok maradnak
- **Naplóbejegyzés**: `workflow_cancelled` eseménnyel kerül rögzítésre

## Megszakítva vagy sikertelenül

| Szempont | Sikertelen | Megszakítva |
|---|---|---|
| Kiváltó ok | Egy lépés kimeríti az újrapróbálkozási kísérleteit | A `cancel_workflow()` kifejezett meghívása |
| Állapot | `failed` | `cancelled` |
| Újrapróbálható | Igen, a `retry_workflow()` segítségével, kivéve, ha a munkafolyamatot már kompenzálták | Nem |
| Takarító kezelő | Nem fut le | Lefut, ha a `on_cancel()` segítségével regisztrálták |
| Naplóesemény | `workflow_failed` | `workflow_cancelled` |

## Példa: megszakítás megerősítéssel

Gyakori minta, hogy megszakítás előtt ellenőrzi a munkafolyamat állapotát:

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