
# Munkafolyamat-határidők

Határidő rendelhető a munkafolyamatokhoz. Ha egy futó munkafolyamat a megadott időtartamon belül nem fejeződik be, a Queuety sikertelennek jelöli, és opcionálisan meghív egy kezelőt. A szüneteltetett, jelzésre vagy más munkafolyamatokra váró munkafolyamatok várakozás közben nem járnak le. A határidőket egy hosszan futó `wp queuety work` folyamat körülbelül percenként ellenőrzi; a `--once` feldolgozói és a WP-Cron tartalékmechanizmus nem. Ez afféle holtember-kapcsoló a végtelenségig nem futható munkafolyamatokhoz.

## Határidő beállítása

A maximális időtartam beállításához használja a `must_complete_within()` metódust a munkafolyamat-építőn. A határidő túllépésekor lefutó kezelő regisztrálásához használja a `on_deadline()` metódust.

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

A `must_complete_within()` metódus elnevezett paramétereket fogad, amelyek összeadódnak:

```php
->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
```

## Határidőkezelő

A `on_deadline()` kezelőosztálynak implementálnia kell egy `handle( array $state ): void` metódust. A munkafolyamat nyilvános állapotát kapja meg (az összes olyan kulcsot, amely nem `_` kezdetű).

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

A határidőkezelő opcionális. Ha csak azt szeretné, hogy a munkafolyamat sikertelen legyen egyéni logika futtatása nélkül, használja a `must_complete_within()` metódust `on_deadline()` nélkül.

## A határidő-ellenőrzés működése

A feldolgozó a feldolgozási ciklus részeként 60 másodpercenként ellenőrzi a lejárt határidőket. Ha olyan munkafolyamatot talál, amelynek `status` értéke továbbra is `running`, és a `deadline_at` értéke már elmúlt, meghívja a `on_deadline` kezelőt, ha regisztráltak ilyet, a munkafolyamatot a `Deadline exceeded` hibaüzenettel sikertelennek jelöli, és rögzít egy `workflow_deadline_exceeded` naplóeseményt. Maga a határidő `deadline_at` időbélyegként tárolódik a munkafolyamat sorában, és az indításkor, a beállított időtartamból számítódik ki.

## Mi történik lejáratkor

A határidő túllépésekor a munkafolyamat állapota `failed` értékre változik, a hibaüzenet `Deadline exceeded` lesz, a regisztrált határidőkezelő szinkron módon lefut, és egy `workflow_deadline_exceeded` naplóbejegyzés kerül rögzítésre. A futó feladatok végrehajtás közben nem szakadnak meg, de a munkafolyamat nem lép túl a lejárt lépés határán. Ha maga a határidőkezelő dob kivételt, az csendben elkapásra kerül, a munkafolyamat pedig továbbra is sikertelenül zárul.

## WorkflowBuilder metódusai

| Metódus | Leírás |
|---|---|
| `must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 )` | Beállítja a maximális időtartamot. Minden paraméter összeadódik. |
| `on_deadline( string $handler_class )` | Regisztrálja a határidő túllépésekor meghívott kezelőt. |

## Példa: határidő újrapróbálkozással

Ritkán hasznos újrapróbálni egy határidő miatt sikertelen munkafolyamatot. A `retry_workflow()` visszaállítja `running` értékre, és újra sorba állítja a sikertelen lépést, de nem törli és nem hosszabbítja meg a határidőt, így a következő, körülbelül egy percen belüli ellenőrzés ismét sikertelenséget okoz. Indítson inkább új munkafolyamatot.

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

## Határidő vagy alvási késleltetés

A határidők a teljes munkafolyamat időtartamára vonatkoznak. Az alvási késleltetések (`->delay()`) rögzített időre szüneteltetik a munkafolyamatot a lépéssor részeként. Egy 1 órás alvási késleltetésű és 2 órás határidejű munkafolyamat sikertelen lesz, ha az alvást nem számítva a lépések összesen több mint 1 órát vesznek igénybe.
