Εκτέλεση ροών εργασιών
Μια ροή εργασιών μπορεί να ξεκινήσει μια θυγατρική ροή ως ένα από τα βήματά της. Η γονική ροή τίθεται σε παύση μέχρι να ολοκληρωθεί η εκτέλεση της θυγατρικής· στη συνέχεια, η τελική κατάστασή της συγχωνεύεται με την κατάσταση της γονικής ροής.
Η μέθοδος ->run_workflow()
use Queuety\Queuety;
$enrichment = Queuety::workflow( 'enrich_user' )
->then( FetchSocialHandler::class )
->then( FetchCreditScoreHandler::class );
Queuety::workflow( 'onboarding' )
->then( CreateAccountHandler::class )
->run_workflow( 'enrich_user', $enrichment )
->then( SendWelcomeEmailHandler::class )
->dispatch( [ 'email' => 'user@example.com' ] );
Η μέθοδος run_workflow() δέχεται δύο ορίσματα:
- Ένα όνομα για τη ροή εργασιών που θα εκτελεστεί
- Ένα στιγμιότυπο
WorkflowBuilderπου ορίζει τα βήματά της
Πώς λειτουργεί
Όταν η γονική ροή εργασιών φτάσει σε ένα βήμα run_workflow:
- Η θυγατρική ροή αποστέλλεται ως ανεξάρτητη ροή εργασιών με δικό της ID
- Η γονική ροή τίθεται σε παύση
- Η θυγατρική ροή εκτελεί κανονικά τα βήματά της
- Όταν ολοκληρωθεί η θυγατρική ροή, η τελική κατάστασή της συγχωνεύεται με την κατάσταση της γονικής ροής
- Η γονική ροή συνεχίζεται από το επόμενο βήμα
Κατάσταση γονικής και θυγατρικής ροής
Η θυγατρική ροή λαμβάνει τη συσσωρευμένη κατάσταση της γονικής ροής ως αρχικό φορτίο. Έτσι, τα θυγατρικά βήματα μπορούν να έχουν πρόσβαση σε δεδομένα που παρήγαγαν προηγούμενα γονικά βήματα:
class CreateAccountHandler implements Step {
public function handle( array $state ): array {
$user_id = wp_create_user( $state['email'], wp_generate_password() );
return [ 'user_id' => $user_id ];
}
public function config(): array {
return [];
}
}
// This run-workflow step can access 'user_id' from the parent
class FetchSocialHandler implements Step {
public function handle( array $state ): array {
$profile = fetch_social_profile( $state['user_id'] );
return [ 'social_data' => $profile ];
}
public function config(): array {
return [];
}
}
Συγχώνευση κατάστασης
Όταν ολοκληρωθεί η θυγατρική ροή, η τελική κατάστασή της (εκτός από εσωτερικά κλειδιά όπως τα _steps, _queue, _priority, _max_attempts) συγχωνεύεται με την κατάσταση της γονικής ροής. Το επόμενο γονικό βήμα βλέπει όλα τα δεδομένα από τα προηγούμενα βήματα της γονικής και τη θυγατρική ροή:
class SendWelcomeEmailHandler implements Step {
public function handle( array $state ): array {
// Has access to:
// - $state['email'] (from initial dispatch)
// - $state['user_id'] (from CreateAccountHandler)
// - $state['social_data'] (from run-workflow's FetchSocialHandler)
// - $state['credit_score'] (from run-workflow's FetchCreditScoreHandler)
send_welcome_email( $state['email'], $state['social_data'] );
return [ 'welcome_sent' => true ];
}
public function config(): array {
return [];
}
}
Επιλογές θυγατρικής ροής
Οι επιλογές on_queue(), with_priority() και max_attempts() της κατασκευής θυγατρικής ροής ισχύουν για τη θυγατρική ροή εργασιών. Οι υπόλοιπες επιλογές σε επίπεδο ροής στον κατασκευαστή της θυγατρικής, όπως οι on_cancel(), prune_state_after(), must_complete_within(), version(), idempotency_key(), τα όρια max_*() και το compensate_on_failure(), δεν μεταφέρονται:
$sub = Queuety::workflow( 'heavy_processing' )
->on_queue( 'background' )
->with_priority( Priority::Normal )
->max_attempts( 5 )
->then( StepA::class )
->then( StepB::class );
Queuety::workflow( 'parent' )
->run_workflow( 'heavy', $sub )
->then( FinalStep::class )
->dispatch( $payload );
Ένθετες θυγατρικές ροές
Οι θυγατρικές ροές μπορούν να περιέχουν και οι ίδιες θυγατρικές ροές, επιτρέποντας οποιοδήποτε βάθος ένθεσης:
$inner = Queuety::workflow( 'inner' )
->then( InnerStepA::class )
->then( InnerStepB::class );
$middle = Queuety::workflow( 'middle' )
->then( MiddleStepA::class )
->run_workflow( 'inner', $inner )
->then( MiddleStepB::class );
Queuety::workflow( 'outer' )
->then( OuterStepA::class )
->run_workflow( 'middle', $middle )
->then( OuterStepB::class )
->dispatch( $payload );