Лучшие способы совмещения Active Job и Action Mailer? - PullRequest
0 голосов
/ 27 сентября 2018

При использовании Rails Action Mailer у вас есть возможность использовать deliver_now для немедленной отправки электронной почты или deliver_later для асинхронной отправки с использованием Active Job.Если в активном задании не указан адаптер, он будет использовать пул потоков в процессе, который не сохранится, если сервер остановится.В качестве альтернативы я могу создать работу для управления своей электронной почтой, которую я затем могу назвать с помощью perform_now или perform_later, что, как я понимаю, более или менее точно так же, как deliver_now и deliver_later.

У меня вопрос: если я укажу адаптер, скажем, Sidekiq, а затем создаю базу данных для хранения моих заданий, зачем мне создавать задания для обработки моих электронных писем?Есть ли какая-то дополнительная выгода или это ненужный шаг?С другой стороны, если я хочу создать работу для процесса, мой метод электронной почты должен иметь deliver_now или просто ничего вообще?Я предполагаю, что если в электронном письме будет указано deliver_later, будет ли оно отбрасывать письмо обратно в конец очереди и заставит его ждать снова, пока оно не будет отправлено?


Чтобы проиллюстрировать, что если у меня нет настроенной работы для обработки моих электронных писем, я мог бы просто иметь:
class UserMailer < ActionMailer::Base
  def send_email(user)
    mail(to: user.email, subject: "My Subject")
  end
end

Чтобы позвонить, я бы использовал: UserMailer.send_email(my_user).deliver_later.

Однако, если бы я хотел добавить работу, и обе опции были вызваны с помощью UserJob.perform_later(user), мои настройки были бы:

class UserJob < ActiveJob::Base
  def perform(user)
    UserMailer.send_email(user).deliver_now
  end
end

или

def perform(user)
  UserMailer.send_email(user)
end

Наконец, я недумаю, что это имеет смысл, но что бы произошло бы , если бы я использовал:

def perform(user)
  UserMailer.send_email(user).deliver_later
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...