Refactoring: Extract ActiveJob logic into concern to prevent/avoid fat class.

This commit is contained in:
Thorsten Eckel 2020-02-27 16:41:35 +01:00
parent 754231cfbf
commit a6285f6566
2 changed files with 23 additions and 14 deletions

View file

@ -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

View file

@ -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