Gå til indhold

Deadlines for arbejdsgange

Arbejdsgange kan tildeles en deadline. Hvis en kørende arbejdsgang ikke er afsluttet inden for den angivne varighed, markerer Queuety den som mislykket og kalder eventuelt en handler. Arbejdsgange, der er sat på pause eller venter på et signal eller på andre arbejdsgange, udløber ikke, mens de venter. Deadlines kontrolleres cirka én gang i minuttet af en langvarigt kørende proces wp queuety work, ikke af --once-workere eller WP-Cron-fallbacken. Det fungerer som en dødmandskontakt for langvarige arbejdsgange, der ikke bør køre på ubestemt tid.

Angiv en deadline

Brug must_complete_within() på arbejdsgangens builder til at angive den maksimalt tilladte varighed. Brug on_deadline() til at registrere en handler, der køres, når deadlinen overskrides.

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

Metoden must_complete_within() accepterer navngivne parametre, der lægges sammen:

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

Deadline-handler

Handler-klassen on_deadline() skal implementere en handle( array $state ): void-metode. Den modtager den offentlige arbejdsgangstilstand (alle nøgler, der ikke starter med _).

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

Deadline-handleren er valgfri. Hvis du kun vil have arbejdsgangen til at mislykkes uden at køre brugerdefineret logik, skal du bruge must_complete_within() uden on_deadline().

Sådan fungerer deadlinekontrollen

Workeren kontrollerer for udløbne deadlines hvert 60. sekund som led i sin behandlingsløkke. Når den finder en arbejdsgang, hvor status stadig er running, og deadline_at ligger i fortiden, kalder den handleren on_deadline, hvis en sådan er registreret, markerer arbejdsgangen som mislykket med fejlmeddelelsen Deadline exceeded og registrerer en loghændelse af typen workflow_deadline_exceeded. Selve deadlinen gemmes som et tidsstempel af typen deadline_at på arbejdsgangsrækken og beregnes ved afsendelse ud fra den konfigurerede varighed.

Hvad sker der ved udløb

Når en arbejdsgang overskrider sin deadline, ændres dens status til failed, fejlmeddelelsen sættes til Deadline exceeded, deadline-handleren køres synkront, hvis en sådan er registreret, og en logpost af typen workflow_deadline_exceeded registreres. Kørende jobs afbrydes ikke midt i udførelsen, men arbejdsgangen fortsætter ikke forbi grænsen for det udløbne trin. Hvis deadline-handleren selv kaster en undtagelse, indfanges den lydløst, og arbejdsgangen ender stadig som mislykket.

WorkflowBuilder-metoder

Metode Beskrivelse
must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 ) Angiv den maksimalt tilladte varighed. Alle parametre lægges sammen.
on_deadline( string $handler_class ) Registrer en handler, der kaldes, når deadlinen overskrides.

Eksempel: deadline med genforsøg

Det er sjældent nyttigt at prøve en arbejdsgang igen, hvis den mislykkedes på grund af sin deadline. retry_workflow() nulstiller den til running og sætter det mislykkede trin i kø igen, men den rydder ikke deadlinen eller forlænger den, så den fejler igen ved næste deadlinekontrol, inden for cirka et minut. Send en ny arbejdsgang i stedet.

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

Deadline eller søvnforsinkelser

Deadlines gælder for hele arbejdsgangens varighed. Søvnforsinkelser (->delay()) sætter arbejdsgangen på pause i en fast varighed som led i dens trinsekvens. En arbejdsgang med en søvnforsinkelse på 1 time og en deadline på 2 timer mislykkes, hvis de trin, der ikke er søvntrin, samlet tager mere end 1 time.