lib/good_job/job.rb in good_job-1.0.2 vs lib/good_job/job.rb in good_job-1.0.3
- old
+ new
@@ -19,33 +19,25 @@
end)
scope :only_scheduled, -> { where(arel_table['scheduled_at'].lteq(Time.current)).or(where(scheduled_at: nil)) }
scope :priority_ordered, -> { order(priority: :desc) }
scope :finished, ->(timestamp = nil) { timestamp ? where(arel_table['finished_at'].lteq(timestamp)) : where.not(finished_at: nil) }
- def self.perform_with_advisory_lock(destroy_after: !GoodJob.preserve_job_records)
+ def self.perform_with_advisory_lock
good_job = nil
result = nil
error = nil
unfinished.only_scheduled.limit(1).with_advisory_lock do |good_jobs|
good_job = good_jobs.first
break unless good_job
- result, error = good_job.perform(destroy_after: destroy_after)
+ result, error = good_job.perform
end
[good_job, result, error] if good_job
end
- def self.perform_with_advisory_lock_and_preserve_job_records
- perform_with_advisory_lock(destroy_after: false)
- end
-
- def self.perform_with_advisory_lock_and_destroy_job_records
- perform_with_advisory_lock(destroy_after: true)
- end
-
def self.enqueue(active_job, scheduled_at: nil, create_with_advisory_lock: false)
good_job = nil
ActiveSupport::Notifications.instrument("enqueue_job.good_job", { active_job: active_job, scheduled_at: scheduled_at, create_with_advisory_lock: create_with_advisory_lock }) do |instrument_payload|
good_job = GoodJob::Job.new(
queue_name: active_job.queue_name.presence || DEFAULT_QUEUE_NAME,
@@ -62,43 +54,52 @@
end
good_job
end
- def perform(destroy_after: true)
+ def perform(destroy_after: !GoodJob.preserve_job_records, reperform_on_standard_error: GoodJob.reperform_jobs_on_standard_error)
raise PreviouslyPerformedError, 'Cannot perform a job that has already been performed' if finished_at
result = nil
+ rescued_error = nil
error = nil
ActiveSupport::Notifications.instrument("before_perform_job.good_job", { good_job: self })
self.performed_at = Time.current
save! unless destroy_after
- ActiveSupport::Notifications.instrument("perform_job.good_job", { good_job: self }) do
- params = serialized_params.merge(
- "provider_job_id" => id
- )
- begin
+ params = serialized_params.merge(
+ "provider_job_id" => id
+ )
+
+ begin
+ ActiveSupport::Notifications.instrument("perform_job.good_job", { good_job: self }) do
result = ActiveJob::Base.execute(params)
- rescue StandardError => e
- error = e
end
+ rescue StandardError => e
+ rescued_error = e
end
- if error.nil? && result.is_a?(Exception)
+ if rescued_error
+ error = rescued_error
+ elsif result.is_a?(Exception)
error = result
result = nil
end
error_message = "#{error.class}: #{error.message}" if error
self.error = error_message
- self.finished_at = Time.current
- if destroy_after
- destroy!
- else
+ if rescued_error && reperform_on_standard_error
save!
+ else
+ self.finished_at = Time.current
+
+ if destroy_after
+ destroy!
+ else
+ save!
+ end
end
[result, error]
end
end