Pereiti prie turinio

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ą.