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

Επαναλήψεις

Οι ροές εργασιών Queuety είναι αλυσίδες βημάτων με καθορισμένη σειρά. Χρησιμοποιήστε ένα βήμα ελέγχου επανάληψης για να επιστρέψετε σε ένα προηγούμενο βήμα με όνομα, αντί να γράφετε χειροκίνητα τη λογική _next_step.

Επιλέξτε τη μορφή που ταιριάζει στη ροή εργασιών:

  • μια δημόσια state_key όταν η συνθήκη είναι απλή
  • μια condition_class όταν η επανάληψη χρειάζεται πιο σύνθετη λογική
  • max_iterations όταν η ίδια η επανάληψη χρειάζεται ένα αυστηρό όριο

Και οι δύο μέθοδοι στοχεύουν σε ένα προηγούμενο βήμα με όνομα, ώστε η επανάληψη να παραμένει σειριοποιήσιμη, επαναλήψιμη και προστατευμένη από τον ίδιο χρόνο εκτέλεσης ροών εργασιών όπως κάθε άλλο βήμα.

Η συνθήκη επανάληψης αξιολογείται με βάση τη διατηρημένη δημόσια κατάσταση της ροής εργασιών μετά την ολοκλήρωση του προηγούμενου βήματος, ώστε κάθε επανάληψη να διατηρείται ακόμη και μετά από επανεκκινήσεις εργατών.

repeat_until() με κλειδί κατάστασης

PHP
Queuety::workflow( 'approval_revision_loop' )
    ->max_transitions( 12 )
    ->then( DraftBriefStep::class, 'draft' )
    ->wait_for_decision( result_key: 'review' )
    ->then( NormalizeReviewOutcomeStep::class, 'review_outcome' )
    ->repeat_until( 'draft', 'review_approved', true, 'repeat_draft_until_approved' )
    ->then( PublishBriefStep::class )
    ->dispatch( [ 'brief_id' => 42 ] );

Το NormalizeReviewOutcomeStep μπορεί να απλοποιήσει το φορτίο της απόφασης σε ένα απλό δημόσιο κλειδί:

PHP
class NormalizeReviewOutcomeStep implements \Queuety\Step {
    public function handle( array $state ): array {
        return [
            'review_approved' => 'approved' === ( $state['review']['outcome'] ?? null ),
        ];
    }

    public function config(): array {
        return [];
    }
}

Αν το review_approved εξακολουθεί να μην είναι true, το βήμα επανάληψης επιστρέφει στο draft. Μόλις γίνει true, η ροή εργασιών συνεχίζεται στο PublishBriefStep.

Τα σήματα αποθηκεύονται, δεν καταναλώνονται. Στη δεύτερη διέλευση από το wait_for_decision(), το προηγούμενο σήμα rejected εξακολουθεί να ταιριάζει και η αναμονή ολοκληρώνεται αμέσως, οπότε ο βρόχος θα επαναλαμβανόταν μέχρι να τον σταματήσει το max_transitions(). Δώστε σε κάθε γύρο το δικό του κλειδί: κάντε το DraftBriefStep να επιστρέφει ένα αυξανόμενο review_round, περάστε το correlation_key: 'review_round' στο wait_for_decision() και ζητήστε από τον αξιολογητή να στείλει το ίδιο review_round στο φορτίο του σήματος. Έτσι, η αναμονή ολοκληρώνεται μόνο όταν το review_round του σήματος ισούται με την τρέχουσα τιμή κατάστασης.

repeat_until() με κλάση συνθήκης

PHP
use App\Workflows\ReviewApprovedCondition;

Queuety::workflow( 'approval_revision_loop' )
    ->then( DraftBriefStep::class, 'draft' )
    ->wait_for_decision( result_key: 'review' )
    ->repeat_until(
        target_step: 'draft',
        condition_class: ReviewApprovedCondition::class,
        max_iterations: 5,
        name: 'repeat_draft_until_approved',
    )
    ->then( PublishBriefStep::class )
    ->dispatch( [ 'brief_id' => 42 ] );
PHP
namespace App\Workflows;

use Queuety\Contracts\RepeatCondition;

final class ReviewApprovedCondition implements RepeatCondition {
    public function matches( array $state ): bool {
        return 'approved' === ( $state['review']['outcome'] ?? null );
    }
}

Οι κλάσεις συνθηκών λαμβάνουν τη δημόσια κατάσταση της ροής εργασιών, ώστε το κατηγόρημα να παραμένει σειριοποιήσιμο και επιθεωρήσιμο χωρίς να εξαρτάται από closures.

repeat_while()

PHP
Queuety::workflow( 'poll_remote_status' )
    ->max_transitions( 20 )
    ->then( PollRemoteStatusStep::class, 'poll' )
    ->delay( seconds: 30 )
    ->repeat_while( 'poll', 'should_poll_again', true, 'repeat_poll' )
    ->then( FinalizeImportStep::class )
    ->dispatch( [ 'import_id' => 99 ] );

Αυτό το μοτίβο είναι χρήσιμο όταν ένα βήμα γράφει μια απλή boolean τιμή, όπως should_poll_again, has_more_pages ή needs_revision.

Γιατί οι επαναλήψεις είναι ξεχωριστές από το _next_step

Μπορείτε και πάλι να δημιουργείτε διακλαδώσεις χειροκίνητα επιστρέφοντας _next_step από ένα κανονικό βήμα. Οι βοηθητικές λειτουργίες επανάληψης προορίζονται για την πιο συγκεκριμένη περίπτωση όπου:

  • ο στόχος είναι ένα προηγούμενο βήμα
  • η συνθήκη προκύπτει από τη δημόσια κατάσταση της ροής εργασιών
  • θέλετε η λογική επανάληψης να παραμένει ορατή στον ίδιο τον ορισμό της ροής εργασιών

Έτσι, οι επαναλήψεις επιθεωρούνται ευκολότερα στις εξαγωγές, στα αρχεία καταγραφής συμβάντων και στην τεκμηρίωση, από ό,τι αν η επιστροφή σε προηγούμενο βήμα ήταν κρυμμένη μέσα σε αυθαίρετο κώδικα βημάτων.

Περιορισμός των επαναλήψεων

Χρησιμοποιήστε το max_iterations όταν χρειάζεται ένα τοπικό αυστηρό όριο για μια συγκεκριμένη επανάληψη:

PHP
Queuety::workflow( 'poll_remote_status' )
    ->then( PollRemoteStatusStep::class, 'poll' )
    ->repeat_while( 'poll', 'should_poll_again', true, max_iterations: 8 )
    ->dispatch();

Χρησιμοποιήστε το max_transitions() όταν χρειάζεται ένας ευρύτερος μηχανισμός έκτακτης διακοπής για ολόκληρη τη ροή εργασιών:

PHP
Queuety::workflow( 'safe_revision_loop' )
    ->max_transitions( 10 )
    ->then( DraftBriefStep::class, 'draft' )
    ->wait_for_decision( result_key: 'review' )
    ->then( NormalizeReviewOutcomeStep::class )
    ->repeat_until( 'draft', 'review_approved', true )
    ->dispatch();

Αν μια επανάληψη υπερβεί το max_iterations ή η ροή εργασιών υπερβεί το max_transitions(), το Queuety αποτυγχάνει την εκτέλεση αντί να την αφήσει να επαναλαμβάνεται επ' αόριστον.