Я пытаюсь планировать доставку электронной почты , используя всякий раз и задачу rake
every 1.month, at: 'start of the month at 4am' do
rake "reports:deliver_reports"
end
Внутри моей задачи rake , я использую класс для ставить в очередь все доставки электронной почты :
# reports.rake
namespace :reports do
# rake reports:deliver_reports
desc "Send reports to users"
task deliver_reports: :environment do
QueueReportsService.call
end
end
А внутри этого класса я ставлю в очередь каждую доставку электронной почты.
class QueueReportsService
def self.call
users = User.all
users.each { |user| ReportMailer.report(user).deliver_later }
end
end
На основе вопрос и ответы на него ранее размещенные на SO Я понимаю, что:
Сам Rails предоставляет только систему очередей в процессе, которая сохраняет задания только в RAM .
И это:
... Использование асинхронной очереди из задачи Rake (... для отправки электронной почты с использованием .deliver_later) обычно не будетработать , потому что Rake, скорее всего, закончится, вызывая удаление пула потоков в процессе ...
Я знаю, что вместо deliver_later
используется deliver
будет отправлять электронные письма.
class QueueReportsService
def self.call
users = User.all
users.each { |user| ReportMailer.report(user).deliver }
end
end
Однако Если по какой-либо причине задача rake прерывается, каждое последующее электронное письмо не будет отправлено. Я бы хотел предотвратить это , запланировав отдельную работу для каждого пользователя электронной почты , которая, если что-то пойдет не так, потерпит неудачу в изоляции.