Pāriet uz saturu

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.