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.
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:
->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 _).
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.
$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.