Työnkulun signaalit
Työnkulut voivat keskeyttää suorituksen ja odottaa ulkoista syötettä signaalien avulla. Rakentajametodit wait_for_signal() ja wait_for_signals() lisäävät vaiheita, jotka pysäyttävät työnkulun, kunnes sovelluksesi, operaattori tai toinen järjestelmä lähettää odotetun signaalin kohteen Queuety::signal() kautta.
Ihmisen osallistumista edellyttäviin työnkulkuihin Queuety sisältää myös:
wait_for_approval()nimiavaruudellisen hyväksyntähyötykuorman käsittelyynwait_for_input()jäsennellyn ihmisen antaman syötteen käsittelyynwait_for_decision()selkeisiin hyväksy/hylkää-tuloksiin
Laajempi kokonaisvaltainen esimerkki, jossa yhdistyvät agenttien suoritukset ja ihmisen tarkistuspisteet, löytyy kohdasta Agenttien orkestrointi.
->wait_for_signal()-metodi
Lisää työnkulkuun signaalia odottava vaihe:
use Queuety\Queuety;
$workflow_id = Queuety::workflow( 'content_approval' )
->then( DraftContentHandler::class )
->wait_for_signal( 'approved' )
->then( PublishContentHandler::class )
->dispatch( [ 'post_id' => 99 ] );
Kun työnkulku saavuttaa vaiheen wait_for_signal, sen tilaksi asetetaan waiting_for_signal ja suoritus keskeytetään. Odotuksen aikana työtehtäviä ei suoriteta eikä resursseja kuluteta.
Oletusarvoisesti yksittäinen signaalin hyötykuorma yhdistetään työnkulun ylätason tilaan. Jos haluat sen sen sijaan omaan nimiavaruuteensa, välitä result_key:
$workflow_id = Queuety::workflow( 'content_approval' )
->then( DraftContentHandler::class )
->wait_for_signal( 'approved', 'approval' )
->then( PublishContentHandler::class )
->dispatch( [ 'post_id' => 99 ] );
Kun signaali saapuu, $state['approval'] sisältää signaalin hyötykuormataulukon.
Useiden signaalien odottaminen
Käytä arvoa wait_for_signals(), kun työnkulun tulee jatkua useista mahdollisista signaaleista minkä tahansa saapuessa tai kun sen on kerättävä kaikki vaaditut signaalit ennen jatkamista.
use Queuety\Enums\WaitMode;
$workflow_id = Queuety::workflow( 'moderation_gate' )
->then( SubmitForReviewHandler::class )
->wait_for_signals(
[ 'editor_approved', 'legal_approved' ],
WaitMode::All,
'approvals'
)
->then( PublishContentHandler::class )
->dispatch();
WaitMode::Allodottaa, kunnes jokainen määritetty signaali on kirjattu.WaitMode::Anyjatkaa suoritusta heti, kun ensimmäinen määritetyistä signaaleista saapuu.
Arvon result_key yhteydessä usean signaalin odotus tallentaa assosiatiivisen taulukon, jonka avaimina ovat signaalien nimet:
[
'editor_approved' => [ 'by' => 'editor@example.com' ],
'legal_approved' => [ 'by' => 'legal@example.com' ],
]
Ilman arvoa result_key täsmäävien signaalien hyötykuormat yhdistetään ylätason tilaan vaiheiden määritysjärjestyksessä.
Täsmäytys ja korrelaatio
Signaalia odottavat vaiheet voivat ohittaa asiaankuulumattomat tapahtumat täsmäyttämällä hyötykuorman sisällön tai korreloimalla yhteisen avaimen perusteella.
$workflow_id = Queuety::workflow( 'review_gate' )
->wait_for_signal(
name: 'review_ready',
result_key: 'review',
match_payload: [ 'source' => 'editorial' ],
correlation_key: 'task_id',
)
->dispatch( [ 'task_id' => 'task-42' ] );
Tässä esimerkissä odotus jatkuu vain, kun:
- signaalin nimi on
review_ready - hyötykuorma sisältää arvon
source: editorial - hyötykuorman
task_idvastaa arvoa$state['task_id']
Tästä on hyötyä, kun useat ulkoiset järjestelmät tai agentit julkaisevat samannimisiä tapahtumia, mutta vain yhden hyötykuorma kuuluu nykyiseen työnkulun suoritukseen.
Ihmisen hyväksyntä- ja syöteapumetodit
wait_for_approval() ja wait_for_input() ovat käteviä kääreitä signaalia odottaville vaiheille. Ne toimivat kuten wait_for_signal(), mutta käyttävät oletusarvoisesti nimiavaruudellista tulosavainta.
$workflow_id = Queuety::workflow( 'blog_review' )
->then( GenerateDraftHandler::class )
->wait_for_approval()
->wait_for_input()
->then( HandleDecisionHandler::class )
->dispatch();
approval-signaalin jälkeen $state['approval'] sisältää hyväksyntähyötykuorman. input-signaalin jälkeen $state['input'] sisältää syötehyötykuorman.
Käytä arvoa wait_for_decision(), kun haluat yhden vaiheen jatkavan suoritusta joko hyväksynnän tai hylkäyksen jälkeen:
$workflow_id = Queuety::workflow( 'legal_review' )
->then( DraftContractHandler::class )
->wait_for_decision( result_key: 'review' )
->then( HandleReviewDecisionHandler::class )
->dispatch();
Kun signaali saapuu, $state['review'] sisältää:
[
'outcome' => 'approved', // or 'rejected'
'signal' => 'approved', // or 'rejected'
'data' => [ 'reviewer' => 'ops@example.com' ],
]
Signaalin lähettäminen
Lähetä työnkulkuun signaali kohteen Queuety::signal() avulla:
Queuety::signal( $workflow_id, 'approved' );
Kun signaali vastaa työnkulun odottamaa signaalia, työnkulku jatkaa suoritusta seuraavaan vaiheeseen.
Ihmisen osallistumista edellyttäviä työnkulkuja varten julkisivu tarjoaa myös semanttisia apumetodeja:
Queuety::approve_workflow( $workflow_id, [ 'reviewer' => 'editor@example.com' ] );
Queuety::reject_workflow( $workflow_id, [ 'reason' => 'needs citations' ] );
Queuety::submit_workflow_input( $workflow_id, [ 'notes' => 'Ship after copy edit' ] );
Signaalin tiedot
Voit lähettää signaalin mukana tietotaulukon. Tiedot yhdistetään työnkulun tilaan, jolloin seuraavat vaiheet voivat käyttää niitä:
Queuety::signal( $workflow_id, 'approved', [
'approved_by' => 'admin@example.com',
'approved_at' => time(),
] );
Seuraavassa vaiheessa:
class PublishContentHandler implements Step {
public function handle( array $state ): array {
// $state['approved_by'] is 'admin@example.com'
// $state['approved_at'] is the timestamp
// $state['post_id'] is 99
wp_update_post( [
'ID' => $state['post_id'],
'post_status' => 'publish',
] );
return [ 'published' => true ];
}
public function config(): array {
return [];
}
}
Alaviivaan _ (underscore) alkavat avaimet on varattu sisäiseen käyttöön, eikä niitä yhdistetä tilaan.
Ennalta lähetetyt signaalit
Signaaleja voi lähettää ennen kuin työnkulku saavuttaa odotusvaiheen. Kun signaali saapuu, se kirjataan taulukkoon queuety_signals työnkulun nykyisestä tilasta riippumatta. Kun työnkulku myöhemmin saavuttaa vaiheen wait_for_signal, se tarkistaa ennalta saapuneet signaalit ja jatkaa heti, jos sellainen löytyy.
Tämä tarkoittaa, että järjestyksellä ei ole väliä:
// Dispatch workflow
$workflow_id = Queuety::workflow( 'order_fulfillment' )
->then( PrepareOrderHandler::class )
->wait_for_signal( 'payment_confirmed' )
->then( ShipOrderHandler::class )
->dispatch( [ 'order_id' => 123 ] );
// Signal arrives before the workflow reaches the wait step
Queuety::signal( $workflow_id, 'payment_confirmed', [ 'transaction_id' => 'txn_abc' ] );
// When the workflow finishes PrepareOrderHandler and reaches the wait step,
// it sees the pre-existing signal and continues immediately.
Työnkulun tila signaalia odotettaessa
Signaalia odotettaessa työnkulun tila on WorkflowStatus::WaitingForSignal (waiting_for_signal):
$state = Queuety::workflow_status( $workflow_id );
echo $state->status->value; // 'waiting_for_signal'
echo $state->wait_type; // 'signal'
echo $state->wait_mode; // 'all' or 'any'
print_r( $state->waiting_for ); // ['approved']
print_r( $state->wait_details ); // matched/remaining, correlation info, result key, ...
Käyttötapaus: ihmisen hyväksyntä
Rakenna hyväksyntätyönkulku, jossa ihmistarkastajan on hyväksyttävä sisältö ennen sen julkaisemista:
$workflow_id = Queuety::workflow( 'blog_review' )
->then( GenerateDraftHandler::class )
->then( NotifyReviewerHandler::class )
->wait_for_decision( result_key: 'review' )
->then( HandleDecisionHandler::class )
->dispatch( [ 'topic' => 'PHP middleware patterns' ] );
NotifyReviewerHandler lähettää sähköpostin tai Slack-viestin, jossa on hyväksymis- ja hylkäyslinkit. Linkit kutsuvat ohjaintasi, joka lähettää signaalin:
// In your approval controller
Queuety::approve_workflow(
$workflow_id,
[
'reviewer' => $current_user->user_email,
'reviewed_at' => time(),
],
'approved'
);
Vaihe HandleDecisionHandler lukee arvon $state['review']['outcome'] ja joko julkaisee tai arkistoi luonnoksen.
Käyttötapaus: ulkoisen API-palvelun takaisinkutsu
Odota ulkoisen palvelun webhook-kutsua:
$workflow_id = Queuety::workflow( 'generate_video' )
->then( SubmitToRenderServiceHandler::class )
->wait_for_signal( 'render_complete' )
->then( DownloadVideoHandler::class )
->then( NotifyUserHandler::class )
->dispatch( [ 'template_id' => 'promo_v2', 'user_id' => 42 ] );
Kun ulkoinen palvelu lähettää pyynnön webhook-päätepisteeseesi:
// In your webhook handler
$payload = json_decode( file_get_contents( 'php://input' ), true );
$workflow_id = (int) $payload['metadata']['workflow_id'];
Queuety::signal( $workflow_id, 'render_complete', [
'video_url' => $payload['output_url'],
'duration' => $payload['duration_seconds'],
] );
Useita signaalien tarkistuspisteitä yhdessä työnkulussa
Työnkulku voi odottaa signaaleja useassa kohdassa:
Queuety::workflow( 'multi_approval' )
->then( CreateProposalHandler::class )
->wait_for_signal( 'manager_approval' )
->then( EscalateToDirectorHandler::class )
->wait_for_signal( 'director_approval' )
->then( ExecuteProposalHandler::class )
->dispatch( [ 'proposal_id' => 7 ] );
Jokainen signaalia odottava vaihe on itsenäinen. Voit yhdistää samaan työnkulkuun arvot wait_for_signal(), wait_for_signals(), wait_for_approval(), wait_for_input() ja wait_for_decision().