1414use Workflow \V2 \Enums \RunStatus ;
1515use Workflow \V2 \Enums \ScheduleOverlapPolicy ;
1616use Workflow \V2 \Enums \ScheduleStatus ;
17+ use Workflow \V2 \Exceptions \WorkflowExecutionUnavailableException ;
1718use Workflow \V2 \Models \WorkflowHistoryEvent ;
1819use Workflow \V2 \Models \WorkflowRun ;
1920use Workflow \V2 \Models \WorkflowSchedule ;
@@ -392,11 +393,20 @@ public static function triggerDetailed(
392393 self ::closeExistingRun ($ schedule , $ overlapPolicy );
393394 }
394395
395- $ startResult = self ::startRun (
396- $ schedule ,
397- effectiveOverlapPolicy: $ overlapPolicy ->value ,
398- context: $ context ,
399- );
396+ try {
397+ $ startResult = self ::startRun (
398+ $ schedule ,
399+ effectiveOverlapPolicy: $ overlapPolicy ->value ,
400+ context: $ context ,
401+ );
402+ } catch (WorkflowExecutionUnavailableException $ exception ) {
403+ self ::recordSkip ($ schedule , $ exception ->blockedReason (), $ context );
404+ $ schedule ->forceFill ([
405+ 'next_fire_at ' => $ schedule ->computeNextFireAtWithJitter (),
406+ ])->save ();
407+
408+ return new ScheduleTriggerResult ('skipped ' , null , null , $ exception ->blockedReason ());
409+ }
400410
401411 return new ScheduleTriggerResult ('triggered ' , $ startResult ->instanceId , $ startResult ->runId , null );
402412 });
@@ -441,6 +451,15 @@ public static function tick(int $limit = 100): array
441451 'instance_id ' => $ instanceId ,
442452 ];
443453 }
454+ } catch (WorkflowExecutionUnavailableException $ exception ) {
455+ $ schedule ->refresh ();
456+ self ::recordSkip ($ schedule , $ exception ->blockedReason ());
457+ $ results [] = [
458+ 'schedule_id ' => $ schedule ->schedule_id ,
459+ 'instance_id ' => null ,
460+ 'outcome ' => 'skipped ' ,
461+ 'reason ' => $ exception ->blockedReason (),
462+ ];
444463 } catch (\Throwable $ e ) {
445464 $ schedule ->refresh ();
446465 $ schedule ->recordFailure ($ e ->getMessage ());
@@ -617,13 +636,19 @@ private static function triggerForBackfill(
617636 self ::closeExistingRun ($ schedule , $ effectivePolicy );
618637 }
619638
620- return self ::startRun (
621- $ schedule ,
622- occurrenceTime: $ occurrenceTime ,
623- outcome: 'backfilled ' ,
624- effectiveOverlapPolicy: $ effectivePolicy ->value ,
625- context: $ context ,
626- )->instanceId ;
639+ try {
640+ return self ::startRun (
641+ $ schedule ,
642+ occurrenceTime: $ occurrenceTime ,
643+ outcome: 'backfilled ' ,
644+ effectiveOverlapPolicy: $ effectivePolicy ->value ,
645+ context: $ context ,
646+ )->instanceId ;
647+ } catch (WorkflowExecutionUnavailableException $ exception ) {
648+ self ::recordSkip ($ schedule , $ exception ->blockedReason (), $ context );
649+
650+ return null ;
651+ }
627652 });
628653 }
629654
@@ -642,6 +667,8 @@ private static function startRun(
642667
643668 try {
644669 $ result = $ starter ->start ($ schedule , $ occurrenceTime , $ outcome , $ effectiveOverlapPolicy );
670+ } catch (WorkflowExecutionUnavailableException $ exception ) {
671+ throw $ exception ;
645672 } catch (\Throwable $ e ) {
646673 $ schedule ->recordFailure ($ e ->getMessage ());
647674 $ schedule ->save ();
0 commit comments