Ugrás a tartalomhoz

Munkafolyamatok futtatása

A munkafolyamat egyik lépéseként elindíthat egy gyermek-munkafolyamatot. A szülő megvárja a munkafolyamat-futtató befejezését, majd egyesíti a gyermek végső állapotát a sajátjával.

A ->run_workflow() metódus

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

A run_workflow() metódus két argumentumot fogad:

  1. A munkafolyamat-futtató neve
  2. Egy WorkflowBuilder példány, amely meghatározza a munkafolyamat-futtató lépéseit

Működés

Amikor a szülő-munkafolyamat eléri a run_workflow lépést:

  1. A munkafolyamat-futtató önálló munkafolyamatként, saját azonosítóval indul el
  2. A szülő-munkafolyamat szünetel
  3. A munkafolyamat-futtató a szokásos módon végigfut a lépésein
  4. A munkafolyamat-futtató befejezésekor annak végső állapota egyesül a szülő állapotával
  5. A szülő-munkafolyamat a következő lépéssel folytatódik

Szülő- és gyermekállapot

A munkafolyamat-futtató kezdeti adatcsomagként megkapja a szülő aktuális, felhalmozott állapotát. Így a gyermeklépések hozzáférhetnek a korábbi szülőlépések által előállított adatokhoz:

PHP
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 [];
    }
}

Állapotok egyesítése

A munkafolyamat-futtató befejezésekor annak végső állapota (a belső kulcsok, például _steps, _queue, _priority és _max_attempts kivételével) egyesül a szülő állapotával. A következő szülőlépés a korábbi szülőlépések és a munkafolyamat-futtató összes adatát látja:

PHP
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 [];
    }
}

A munkafolyamat-futtató beállításai

A munkafolyamat-futtató összeállítójának on_queue(), with_priority() és max_attempts() értékei a gyermek-munkafolyamatra vonatkoznak. A gyermek összeállítójának más munkafolyamat-szintű beállításai, például a on_cancel(), a prune_state_after(), a must_complete_within(), a version(), a idempotency_key(), a max_*() költségkeretek és a compensate_on_failure(), nem öröklődnek:

PHP
$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 );

Beágyazott munkafolyamat-futtatók

A munkafolyamat-futtatók maguk is tartalmazhatnak munkafolyamat-futtatókat, így tetszőleges mélységben egymásba ágyazhatók:

PHP
$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 );