Refactoring: Extract ActiveJob logic into concern to prevent/avoid fat class.
This commit is contained in:
parent
754231cfbf
commit
a6285f6566
2 changed files with 23 additions and 14 deletions
|
@ -1,21 +1,9 @@
|
||||||
class ApplicationJob < ActiveJob::Base
|
class ApplicationJob < ActiveJob::Base
|
||||||
|
include ApplicationJob::HasDelayedJobMonitoringCompatibilty
|
||||||
|
|
||||||
# Automatically retry jobs that encountered a deadlock
|
# Automatically retry jobs that encountered a deadlock
|
||||||
# retry_on ActiveRecord::Deadlocked
|
# retry_on ActiveRecord::Deadlocked
|
||||||
|
|
||||||
# Most jobs are safe to ignore if the underlying records are no longer available
|
# Most jobs are safe to ignore if the underlying records are no longer available
|
||||||
# discard_on ActiveJob::DeserializationError
|
# discard_on ActiveJob::DeserializationError
|
||||||
|
|
||||||
# We (currently) rely on Delayed::Job#attempts to check for stuck backends
|
|
||||||
# e.g. in the MonitoringController.
|
|
||||||
# This is a workaround to sync ActiveJob#executions to Delayed::Job#attempts
|
|
||||||
# until we resolve this dependency.
|
|
||||||
after_enqueue do |job|
|
|
||||||
# skip update of `attempts` attribute if job wasn't queued because of ActiveJobLock
|
|
||||||
#(another job with same lock key got queued before this job could be retried)
|
|
||||||
next if job.provider_job_id.blank?
|
|
||||||
|
|
||||||
# update the column right away without loading Delayed::Job record
|
|
||||||
# see: https://stackoverflow.com/a/34264580
|
|
||||||
Delayed::Job.where(id: job.provider_job_id).update_all(attempts: job.executions) # rubocop:disable Rails/SkipsModelValidations
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
class ApplicationJob
|
||||||
|
module HasDelayedJobMonitoringCompatibilty
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
# We (currently) rely on Delayed::Job#attempts to check for stuck backends
|
||||||
|
# e.g. in the MonitoringController.
|
||||||
|
# This is a workaround to sync ActiveJob#executions to Delayed::Job#attempts
|
||||||
|
# until we resolve this dependency.
|
||||||
|
after_enqueue do |job|
|
||||||
|
# skip update of `attempts` attribute if job wasn't queued because of ActiveJobLock
|
||||||
|
#(another job with same lock key got queued before this job could be retried)
|
||||||
|
next if job.provider_job_id.blank?
|
||||||
|
|
||||||
|
# update the column right away without loading Delayed::Job record
|
||||||
|
# see: https://stackoverflow.com/a/34264580
|
||||||
|
Delayed::Job.where(id: job.provider_job_id).update_all(attempts: job.executions) # rubocop:disable Rails/SkipsModelValidations
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue