Μετάβαση στο περιεχόμενο

Προθεσμίες ροών εργασίας

Μπορείτε να ορίσετε προθεσμία για τις ροές εργασίας. Αν μια εκτελούμενη ροή εργασίας δεν ολοκληρωθεί εντός της καθορισμένης διάρκειας, το Queuety τη χαρακτηρίζει αποτυχημένη και προαιρετικά καλεί έναν χειριστή. Οι ροές εργασίας που βρίσκονται σε παύση ή περιμένουν σήμα ή άλλες ροές εργασίας δεν λήγουν όσο περιμένουν. Οι προθεσμίες ελέγχονται περίπου μία φορά το λεπτό από μια διεργασία wp queuety work μακράς εκτέλεσης και όχι από τους εργάτες --once ή τον εφεδρικό μηχανισμό WP-Cron. Αυτό λειτουργεί ως διακόπτης ασφαλείας για ροές εργασίας μακράς εκτέλεσης που δεν πρέπει να εκτελούνται επ' αόριστον.

Ορισμός προθεσμίας

Χρησιμοποιήστε το must_complete_within() στο πρόγραμμα δημιουργίας ροής εργασίας για να ορίσετε τη μέγιστη επιτρεπόμενη διάρκεια. Χρησιμοποιήστε το on_deadline() για να καταχωρίσετε έναν χειριστή που εκτελείται όταν παρέλθει η προθεσμία.

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

Η μέθοδος must_complete_within() δέχεται ονομασμένες παραμέτρους, οι οποίες αθροίζονται:

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

Χειριστής προθεσμίας

Η κλάση χειριστή on_deadline() πρέπει να υλοποιεί μια μέθοδο handle( array $state ): void. Λαμβάνει τη δημόσια κατάσταση της ροής εργασίας (όλα τα κλειδιά που δεν αρχίζουν με _).

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

Ο χειριστής προθεσμίας είναι προαιρετικός. Αν θέλετε απλώς να αποτύχει η ροή εργασίας χωρίς να εκτελεστεί προσαρμοσμένη λογική, χρησιμοποιήστε το must_complete_within() χωρίς το on_deadline().

Πώς λειτουργεί ο έλεγχος προθεσμιών

Ο εργάτης ελέγχει για προθεσμίες που έχουν λήξει κάθε 60 δευτερόλεπτα, στο πλαίσιο του κύκλου επεξεργασίας του. Όταν εντοπίσει μια ροή εργασίας της οποίας το status παραμένει running και το deadline_at βρίσκεται στο παρελθόν, καλεί τον χειριστή on_deadline, αν έχει καταχωριστεί, χαρακτηρίζει τη ροή εργασίας αποτυχημένη με το μήνυμα σφάλματος Deadline exceeded και καταγράφει ένα συμβάν καταγραφής workflow_deadline_exceeded. Η ίδια η προθεσμία αποθηκεύεται ως χρονική σήμανση deadline_at στη γραμμή της ροής εργασίας και υπολογίζεται κατά την αποστολή, με βάση την καθορισμένη διάρκεια.

Τι συμβαίνει κατά τη λήξη

Όταν μια ροή εργασίας υπερβεί την προθεσμία της, η κατάστασή της αλλάζει σε failed, το μήνυμα σφάλματος ορίζεται σε Deadline exceeded, ο χειριστής προθεσμίας εκτελείται συγχρονισμένα αν έχει καταχωριστεί και καταγράφεται μια εγγραφή workflow_deadline_exceeded. Οι εργασίες που εκτελούνται δεν διακόπτονται στη μέση, αλλά η ροή εργασίας δεν προχωρά πέρα από το όριο του βήματος που έληξε. Αν ο ίδιος ο χειριστής προθεσμίας προκαλέσει εξαίρεση, αυτή παγιδεύεται σιωπηρά και η ροή εργασίας παραμένει αποτυχημένη.

Μέθοδοι WorkflowBuilder

Μέθοδος Περιγραφή
must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 ) Ορίζει τη μέγιστη επιτρεπόμενη διάρκεια. Όλες οι παράμετροι αθροίζονται.
on_deadline( string $handler_class ) Καταχωρίζει έναν χειριστή που καλείται όταν παρέλθει η προθεσμία.

Παράδειγμα: προθεσμία με επανάληψη

Σπάνια έχει νόημα να επαναλάβετε μια ροή εργασίας που απέτυχε λόγω προθεσμίας. Το retry_workflow() την επαναφέρει σε running και θέτει ξανά σε ουρά το αποτυχημένο βήμα, αλλά δεν διαγράφει ούτε παρατείνει την προθεσμία. Έτσι, ο επόμενος έλεγχος προθεσμίας, μέσα σε περίπου ένα λεπτό, θα την κάνει να αποτύχει ξανά. Αντ' αυτού, αποστείλετε μια νέα ροή εργασίας.

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

Προθεσμία και καθυστερήσεις αναμονής

Οι προθεσμίες ισχύουν για τη συνολική διάρκεια της ροής εργασίας. Οι καθυστερήσεις αναμονής (->delay()) θέτουν σε παύση τη ροή εργασίας για καθορισμένο χρονικό διάστημα, ως μέρος της ακολουθίας βημάτων της. Μια ροή εργασίας με καθυστέρηση αναμονής 1 ώρας και προθεσμία 2 ωρών θα αποτύχει αν τα βήματα εκτός αναμονής διαρκέσουν συνολικά πάνω από 1 ώρα.