Pāriet uz saturu

Darbplūsmu palaišana

Darbplūsma vienā no savām darbībām var palaist pakārtotu darbplūsmu. Vecākdarbplūsma tiek apturēta, līdz pakārtotā darbplūsma ir pabeigta, un pēc tam tās beigu stāvoklis tiek apvienots ar vecākdarbplūsmas stāvokli.

Metode ->run_workflow()

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

Metode run_workflow() pieņem divus argumentus:

  1. Darbplūsmas palaišanas nosaukumu
  2. WorkflowBuilder instanci, kas definē darbplūsmas palaišanas darbības

Kā tas darbojas

Kad vecākdarbplūsma sasniedz run_workflow darbību:

  1. Darbplūsma tiek palaista kā neatkarīga darbplūsma ar savu ID
  2. Vecākdarbplūsma tiek apturēta
  3. Pakārtotā darbplūsma parasti izpilda visas savas darbības
  4. Kad pakārtotā darbplūsma ir pabeigta, tās beigu stāvoklis tiek apvienots ar vecākdarbplūsmas stāvokli
  5. Vecākdarbplūsma turpina izpildi ar nākamo darbību

Vecāk- un pakārtotās darbplūsmas stāvoklis

Pakārtotā darbplūsma sākotnējā datu paketē saņem vecākdarbplūsmas pašreizējo uzkrāto stāvokli. Tādējādi pakārtotās darbības var piekļūt datiem, ko izveidojušas iepriekšējās vecāka darbības:

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

Stāvokļu sapludināšana

Kad pakārtotā darbplūsma ir pabeigta, tās beigu stāvoklis (izņemot iekšējās atslēgas, piemēram, _steps, _queue, _priority, _max_attempts) tiek apvienots ar vecākdarbplūsmas stāvokli. Nākamā vecāka darbība redz datus gan no iepriekšējām vecāka darbībām, gan no pakārtotās darbplūsmas:

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

Darbplūsmas palaišanas opcijas

Darbplūsmas palaišanas veidotāja opcijas on_queue(), with_priority() un max_attempts() attiecas uz pakārtoto darbplūsmu. Citas darbplūsmas līmeņa opcijas pakārtotajā veidotājā, piemēram, on_cancel(), prune_state_after(), must_complete_within(), version(), idempotency_key(), max_*() budžeti un compensate_on_failure(), netiek pārnestas:

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

Ligzdotas darbplūsmas palaišanas

Darbplūsmās var būt iekļautas citas darbplūsmas, tādējādi pieļaujot jebkādu ligzdošanas dziļumu:

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