l4d.tools/app/jobs/application_job.rb
2026-01-18 18:50:31 +01:00

57 lines
1.4 KiB
Ruby

class ApplicationJob < ActiveJob::Base
# Automatically retry jobs that encountered a deadlock
# retry_on ActiveRecord::Deadlocked
# Most jobs are safe to ignore if the underlying records are no longer available
# discard_on ActiveJob::DeserializationError
around_perform do |_job, block|
log_entry = create_job_log
@job_log = log_entry
begin
log_entry.update!(status: :running, started_at: Time.current)
log("Job started: #{self.class.name}")
block.call
log("Job completed successfully")
log_entry.update!(status: :completed, finished_at: Time.current)
rescue => e
log("Job failed: #{e.class.name} - #{e.message}")
log(e.backtrace.first(5).join("\n"))
log_entry.update!(
status: :failed,
finished_at: Time.current,
error_message: "#{e.class.name}: #{e.message}"
)
raise
end
end
private
def create_job_log
server_id = extract_server_id_from_arguments
JobLog.create!(
job_class: self.class.name,
job_id: job_id,
arguments: arguments.to_json,
server_id: server_id,
status: :pending
)
end
def extract_server_id_from_arguments
# First argument is typically server_id for server-related jobs
return nil if arguments.empty?
arg = arguments.first
arg.is_a?(Integer) ? arg : nil
end
def log(message)
return unless @job_log
@job_log.append_log(message)
end
end