
# Darbplūsmu termiņi

Darbplūsmām var iestatīt termiņu. Ja darbplūsma nav pabeigta norādītajā laikā, Queuety atzīmē to kā neveiksmīgu un, ja nepieciešams, izsauc apstrādātāju. Apturētajām darbplūsmām un tām, kas gaida signālu vai citas darbplūsmas, gaidīšanas laikā termiņš neiestājas. Termiņus aptuveni reizi minūtē pārbauda ilgstoši darbojošs `wp queuety work` process, nevis `--once` darbinieki vai WP-Cron rezerves mehānisms. Tas darbojas kā avārijas slēdzis ilgstošām darbplūsmām, kurām nevajadzētu darboties bezgalīgi.

## Termiņa iestatīšana

Izmantojiet `must_complete_within()` darbplūsmas veidotājā, lai iestatītu maksimālo atļauto ilgumu. Izmantojiet `on_deadline()`, lai reģistrētu apstrādātāju, kas tiek palaists, kad termiņš ir pārsniegts.

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

Metode `must_complete_within()` pieņem nosauktus parametrus, kuru vērtības tiek saskaitītas:

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

## Termiņa apstrādātājs

Klasei `on_deadline()` jāimplementē metode `handle( array $state ): void`. Tā saņem publisko darbplūsmas stāvokli (visas atslēgas, kas nesākas ar `_`).

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

Termiņa apstrādātājs nav obligāts. Ja vēlaties, lai darbplūsma tikai beidzas ar kļūdu bez pielāgotas loģikas palaišanas, izmantojiet `must_complete_within()` bez `on_deadline()`.

## Kā darbojas termiņu pārbaude

Darbinieks pārbauda, vai termiņš nav beidzies, ik pēc 60 sekundēm savā apstrādes ciklā. Kad tas atrod darbplūsmu, kuras `status` joprojām ir `running` un kuras `deadline_at` ir pagātnē, tas izsauc `on_deadline` apstrādātāju, ja tāds reģistrēts, atzīmē darbplūsmu kā neveiksmīgu ar kļūdas ziņojumu `Deadline exceeded` un reģistrē `workflow_deadline_exceeded` žurnāla notikumu. Pats termiņš darbplūsmas rindā tiek glabāts kā `deadline_at` laikspiedols un aprēķināts nosūtīšanas brīdī, ņemot vērā konfigurēto ilgumu.

## Kas notiek, kad termiņš beidzas

Kad darbplūsma pārsniedz tai noteikto termiņu, tās statuss mainās uz `failed`, kļūdas ziņojums tiek iestatīts uz `Deadline exceeded`, sinhroni tiek izpildīts termiņa apstrādātājs, ja tāds ir reģistrēts, un tiek ierakstīts `workflow_deadline_exceeded` žurnāla ieraksts. Izpildāmie uzdevumi netiek pārtraukti izpildes vidū, taču darbplūsma neturpinās pēc soļa robežas, kurā termiņš ir beidzies. Ja pats termiņa apstrādātājs izmet izņēmumu, tas tiek klusi uztverts un darbplūsma tik un tā beidzas ar kļūmi.

## WorkflowBuilder metodes

| Metode | Apraksts |
|---|---|
| `must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 )` | Iestata maksimālo atļauto ilgumu. Visi parametri tiek summēti. |
| `on_deadline( string $handler_class )` | Reģistrē apstrādātāju, kas tiek izsaukts, kad termiņš ir pārsniegts. |

## Piemērs: termiņš un atkārtots mēģinājums

Atkārtot darbplūsmu, kas cietusi neveiksmi termiņa pārsniegšanas dēļ, reti kad ir lietderīgi. `retry_workflow()` atiestata to uz `running` un atkal iekļauj rindā neveiksmīgo soli, taču neatiestata un nepagarina termiņu, tāpēc nākamajā termiņa pārbaudē, aptuveni pēc minūtes, darbplūsma atkal cietīs neveiksmi. Tā vietā sāciet jaunu darbplūsmu.

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

## Termiņi un miega aizkaves

Termiņi attiecas uz visu darbplūsmas ilgumu. Miega aizkaves (`->delay()`) aptur darbplūsmu uz noteiktu laiku kā daļu no tās soļu secības. Darbplūsma ar 1 stundas miega aizkavi un 2 stundu termiņu cietīs neveiksmi, ja soļi, kas nav miega aizkaves, kopā aizņems vairāk nekā 1 stundu.
