class ResumeMailingsJob < ApplicationJob queue_as :mailers STALE_QUEUED_AFTER = 10.minutes def perform recover_stale_queued! Mailing.sending.due_to_send.find_each do |mailing| next unless Mailings::SendClock.new(mailing).open? next if mailing.mailing_recipients.queued.exists? recipient = mailing.mailing_recipients.pending.order(:id).first next unless recipient SendMailingRecipientJob.perform_later(recipient.id) end end private def recover_stale_queued! MailingRecipient.queued.where("updated_at < ?", STALE_QUEUED_AFTER.ago).find_each do |recipient| next unless recipient.mailing.sending? recipient.update!(status: "pending", error_message: nil) end end end