lib/good_job/adapter.rb in good_job-3.24.0 vs lib/good_job/adapter.rb in good_job-3.25.0
- old
+ new
@@ -94,10 +94,17 @@
begin
until inline_executions.empty?
begin
inline_execution = inline_executions.shift
inline_result = inline_execution.perform
+
+ retried_execution = inline_result.retried
+ while retried_execution && retried_execution.scheduled_at <= Time.current
+ inline_execution = retried_execution
+ inline_result = inline_execution.perform
+ retried_execution = inline_result.retried
+ end
ensure
inline_execution.advisory_unlock
inline_execution.run_callbacks(:perform_unlocked)
end
raise inline_result.unhandled_error if inline_result.unhandled_error
@@ -139,29 +146,46 @@
# job there to be enqueued using enqueue_all
return if GoodJob::Bulk.capture(active_job, queue_adapter: self)
Rails.application.executor.wrap do
will_execute_inline = execute_inline? && (scheduled_at.nil? || scheduled_at <= Time.current)
- execution = GoodJob::Execution.enqueue(
- active_job,
- scheduled_at: scheduled_at,
- create_with_advisory_lock: will_execute_inline
- )
+ will_retry_inline = will_execute_inline && CurrentThread.execution&.active_job_id == active_job.job_id && !CurrentThread.retry_now
- if will_execute_inline
+ if will_retry_inline
+ execution = GoodJob::Execution.enqueue(
+ active_job,
+ scheduled_at: scheduled_at
+ )
+ elsif will_execute_inline
+ execution = GoodJob::Execution.enqueue(
+ active_job,
+ scheduled_at: scheduled_at,
+ create_with_advisory_lock: true
+ )
begin
result = execution.perform
+
+ retried_execution = result.retried
+ while retried_execution && (retried_execution.scheduled_at.nil? || retried_execution.scheduled_at <= Time.current)
+ execution = retried_execution
+ result = execution.perform
+ retried_execution = result.retried
+ end
+
+ Notifier.notify(retried_execution.job_state) if retried_execution&.scheduled_at && retried_execution.scheduled_at > Time.current && send_notify?(active_job)
ensure
execution.advisory_unlock
execution.run_callbacks(:perform_unlocked)
end
raise result.unhandled_error if result.unhandled_error
else
- job_state = { queue_name: execution.queue_name }
- job_state[:scheduled_at] = execution.scheduled_at if execution.scheduled_at
+ execution = GoodJob::Execution.enqueue(
+ active_job,
+ scheduled_at: scheduled_at
+ )
- executed_locally = execute_async? && @capsule&.create_thread(job_state)
- Notifier.notify(job_state) if !executed_locally && send_notify?(active_job)
+ executed_locally = execute_async? && @capsule&.create_thread(execution.job_state)
+ Notifier.notify(execution.job_state) if !executed_locally && send_notify?(active_job)
end
execution
end
end