Serializza gli invii SMTP su una coda unica per non far chiudere Aruba.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
class DrainOutboundJob < ApplicationJob
|
||||
queue_as :mailers
|
||||
|
||||
def perform
|
||||
result = Mailings::OutboundQueue.drain_one!
|
||||
return unless result.in?(%i[sent deferred wait])
|
||||
return unless Mailings::OutboundQueue.queued_scope.exists?
|
||||
|
||||
wait = Mailings::OutboundQueue.seconds_until_next_slot
|
||||
wait = 0 if wait.blank? || wait.negative?
|
||||
max_wait = [ Mailings::OutboundQueue.min_interval.to_f, 2.minutes ].max + 5.seconds
|
||||
return if wait > max_wait
|
||||
|
||||
self.class.set(wait: wait).perform_later
|
||||
end
|
||||
end
|
||||
@@ -1,28 +1,16 @@
|
||||
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
|
||||
DrainOutboundJob.perform_later if Mailings::OutboundQueue.queued_scope.exists?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -21,14 +21,11 @@ class SendMailingRecipientJob < ApplicationJob
|
||||
return
|
||||
end
|
||||
|
||||
begin
|
||||
CampaignMailer.raise_delivery_errors = true
|
||||
recipient.deliver!
|
||||
ensure
|
||||
CampaignMailer.raise_delivery_errors = false if Rails.env.development?
|
||||
if recipient.pending? && Mailings::OutboundQueue.enqueue(recipient)
|
||||
nxt = mailing.mailing_recipients.pending.order(:id).first
|
||||
mailing.enqueue_next_recipient!(nxt, from: Time.current + mailing.interval_seconds.seconds)
|
||||
end
|
||||
|
||||
nxt = mailing.mailing_recipients.pending.order(:id).first
|
||||
mailing.enqueue_next_recipient!(nxt, from: Time.current + mailing.interval_seconds.seconds)
|
||||
DrainOutboundJob.perform_later
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user