
# Darbo eigos terminai

Darbo eigoms galima nustatyti terminą. Jei vykdoma darbo eiga neužbaigiama per nurodytą laiką, Queuety pažymi ją kaip nepavykusią ir prireikus iškviečia apdorojimo funkciją. Pristabdytų ar signalo arba kitų darbo eigų laukiančių eigų galiojimas laukimo metu nesibaigia. Ilgai veikiantis procesas `wp queuety work` terminus tikrina maždaug kartą per minutę, o procesai `--once` ir atsarginis mechanizmas WP-Cron jų netikrina. Tai veikia kaip ilgai veikiančių darbo eigų, kurios neturėtų tęstis neribotai, saugiklis.

## Termino nustatymas

Naudokite `must_complete_within()` darbo eigos kūrimo grandinėje, kad nustatytumėte maksimalią leidžiamą trukmę. Naudokite `on_deadline()` apdorojimo funkcijai, kuri vykdoma viršijus terminą, užregistruoti.

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

Metodas `must_complete_within()` priima vardinius parametrus, kurių reikšmės sumuojamos:

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

## Termino apdorojimo funkcija

Termino apdorojimo funkcijos klasė `on_deadline()` turi įgyvendinti metodą `handle( array $state ): void`. Jai perduodama vieša darbo eigos būsena (visi raktai, kurie neprasideda `_`).

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

Termino apdorojimo funkcija yra pasirenkama. Jei norite, kad darbo eiga tiesiog būtų pažymėta kaip nepavykusi ir nebūtų vykdoma pasirinktinė logika, naudokite `must_complete_within()` be `on_deadline()`.

## Kaip tikrinami terminai

Darbuotojas kas 60 sekundžių, vykdydamas apdorojimo ciklą, tikrina, ar nepasibaigė terminai. Radęs darbo eigą, kurios `status` vis dar yra `running`, o `deadline_at` yra praėjęs, jis iškviečia užregistruotą `on_deadline` apdorojimo funkciją, pažymi darbo eigą kaip nepavykusią su klaidos pranešimu `Deadline exceeded` ir įrašo `workflow_deadline_exceeded` žurnalo įvykį. Pats terminas darbo eigos įraše saugomas kaip laiko žyma `deadline_at` ir apskaičiuojamas iš nustatytos trukmės užduoties paskirstymo metu.

## Kas nutinka pasibaigus terminui

Viršijus darbo eigos terminą, jos būsena pasikeičia į `failed`, klaidos pranešimas nustatomas į `Deadline exceeded`, užregistruota termino apdorojimo funkcija vykdoma sinchroniškai, o žurnale įrašomas `workflow_deadline_exceeded` įrašas. Vykdomos užduotys nenutraukiamos viduryje, tačiau darbo eiga nebetęsiama už pasibaigusio termino žingsnio ribos. Jei pati termino apdorojimo funkcija sukelia išimtį, ji tyliai pagaunama, o darbo eiga vis tiek pažymima kaip nepavykusi.

## WorkflowBuilder metodai

| Metodas | Aprašymas |
|---|---|
| `must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 )` | Nustato maksimalią leidžiamą trukmę. Visi parametrai sumuojami. |
| `on_deadline( string $handler_class )` | Užregistruoja funkciją, kuri iškviečiama viršijus terminą. |

## Pavyzdys: terminas ir pakartotinis bandymas

Retai naudinga pakartoti darbo eigą, kurios terminas pasibaigė. `retry_workflow()` atkuria jos būseną į `running` ir iš naujo įtraukia nepavykusį žingsnį į eilę, tačiau termino nepanaikina ir nepratęsia, todėl per kitą termino patikrą (maždaug po minutės) darbo eiga vėl nepavyks. Vietoj to paskirstykite naują darbo eigą.

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

## Terminas ir delsos

Terminai taikomi visai darbo eigos trukmei. Delsos (`->delay()`) pristabdo darbo eigą nustatytam laikui kaip jos žingsnių sekos dalis. Darbo eiga su 1 valandos delsa ir 2 valandų terminu nepavyks, jei ne delsos žingsniai iš viso truks ilgiau nei 1 valandą.
