Class: Coil::TransactionalMessagesCleanupJob

Inherits:
ApplicationJob show all
Defined in:
app/jobs/coil/transactional_messages_cleanup_job.rb

Defined Under Namespace

Classes: ExceededDeadline, Finished

Constant Summary collapse

DuplicateJobError =
Class.new(StandardError)
MAX_DURATION =

Sidekiq is not designed for long-running jobs, so we place an upper bound on job duration. When a job exceeds this bound, we’ll enqueue a subsequent job to pick up where we left off.

5.minutes

Instance Method Summary collapse

Instance Method Details

#perform(batch_size = 1000) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/jobs/coil/transactional_messages_cleanup_job.rb', line 16

def perform(batch_size = 1000)
  result = delete_messages(batch_size)
  total_deletions = result.deletions.values.sum
  deletions_json = result.deletions.to_json

  case result
  when Finished
    Rails.logger.info(<<~INFO.squish)
      #{self.class} finished after deleting #{total_deletions} messages
      (#{deletions_json}).
    INFO
  when ExceededDeadline
    Rails.logger.info(<<~INFO.squish)
      #{self.class} exceeded deadline after deleting #{total_deletions}
      messages (#{deletions_json}). Enqueuing subsequent job.
    INFO
    self.class.perform_async(batch_size)
  end
rescue DuplicateJobError
  # A duplicate job is in the midst of its message-deletion loop. We'll call
  # this job done and allow the other one to continue.
end