Class: Fractor::Workflow::FallbackJobHandler
- Inherits:
-
Object
- Object
- Fractor::Workflow::FallbackJobHandler
- Defined in:
- lib/fractor/workflow/execution/fallback_job_handler.rb
Overview
Handles fallback job execution when a primary job fails. Manages the lifecycle of executing a fallback job and integrating its result back into the workflow context.
Instance Method Summary collapse
-
#execute_fallback(original_job, original_error, job_trace, job_executor, start_time) ⇒ Object
Execute a fallback job for a failed job.
-
#initialize(workflow, context, hooks, logger) ⇒ FallbackJobHandler
constructor
Initialize the fallback handler.
Constructor Details
#initialize(workflow, context, hooks, logger) ⇒ FallbackJobHandler
Initialize the fallback handler.
15 16 17 18 19 20 |
# File 'lib/fractor/workflow/execution/fallback_job_handler.rb', line 15 def initialize(workflow, context, hooks, logger) @workflow = workflow @context = context @hooks = hooks @logger = logger end |
Instance Method Details
#execute_fallback(original_job, original_error, job_trace, job_executor, start_time) ⇒ Object
Execute a fallback job for a failed job.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/fractor/workflow/execution/fallback_job_handler.rb', line 30 def execute_fallback(original_job, original_error, job_trace, job_executor, start_time) fallback_job_name = original_job.fallback_job fallback_job = @workflow.class.jobs[fallback_job_name] unless fallback_job raise WorkflowExecutionError, "Fallback job '#{fallback_job_name}' not found for job '#{original_job.name}'" end @logger.fallback_execution(original_job.name, fallback_job.name, original_error) begin # Execute fallback job using job_executor output = job_executor.execute_once(fallback_job, job_trace) # Store output under original job name as well @context.store_job_output(original_job.name, output) original_job.state(:completed) duration = Time.now - start_time # Update trace job_trace&.complete!(output: output) @logger.job_complete(original_job.name, duration) @hooks.trigger(:job_complete, original_job, output, duration) output rescue StandardError => e @logger.fallback_failed(original_job.name, fallback_job.name, e) raise WorkflowExecutionError, "Job '#{original_job.name}' and fallback '#{fallback_job_name}' both failed" end end |