İçeriğe geç

İş Akışlarını Çalıştırma

Bir iş akışı, adımlarından biri olarak bir alt iş akışı başlatabilir. Üst iş akışı, alt iş akışı tamamlanana kadar bekler; ardından alt iş akışının son durumunu kendi durumuyla birleştirir.

->run_workflow() yöntemi

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

run_workflow() yöntemi iki bağımsız değişken alır:

  1. Çalıştırılacak iş akışı için bir ad
  2. Çalıştırılacak iş akışının adımlarını tanımlayan bir WorkflowBuilder örneği

Nasıl çalışır

Üst iş akışı bir run_workflow adımına ulaştığında:

  1. Çalıştırılacak iş akışı, kendi kimliği olan bağımsız bir iş akışı olarak gönderilir
  2. Üst iş akışı duraklatılır
  3. Çalıştırılacak iş akışı adımlarını normal biçimde yürütür
  4. Çalıştırılacak iş akışı tamamlandığında son durumu üst iş akışının durumuyla birleştirilir
  5. Üst iş akışı sonraki adımla devam eder

Üst/alt iş akışı durumu

Çalıştırılacak iş akışı, üst iş akışının o ana kadar biriktirdiği mevcut durumu başlangıç yükü olarak alır. Böylece alt adımlar, önceki üst adımların ürettiği tüm verilere erişebilir:

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

Durum birleştirme

Çalıştırılacak iş akışı tamamlandığında, son durumu (_steps, _queue, _priority, _max_attempts gibi dahili anahtarlar hariç) üst iş akışının durumuyla birleştirilir. Üst iş akışındaki sonraki adım, hem önceki üst adımların hem de çalıştırılacak iş akışının tüm verilerini görür:

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

Çalıştırılacak iş akışı seçenekleri

Çalıştırılacak iş akışı oluşturucusunun on_queue(), with_priority() ve max_attempts() değerleri alt iş akışına uygulanır. Alt oluşturucudaki on_cancel(), prune_state_after(), must_complete_within(), version(), idempotency_key(), max_*() bütçeleri ve compensate_on_failure() gibi diğer iş akışı düzeyindeki seçenekler aktarılmaz:

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

İç içe çalıştırılan iş akışları

Çalıştırılacak iş akışları kendi içlerinde başka iş akışları da çalıştırabilir; böylece istenen derinlikte iç içe yerleştirme yapılabilir:

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