Задержка почты с ActiveJobs выиграла Rails 4.2
Смотря на ActiveJob
отложить задачи почтовой программы (используя delayed_jobs, delayed_jobs_active_record) и у меня есть 2 вопроса о:
- ActiveJob's ActionMailer's
deliver_later
метод - Если работа может иметь несколько методов выполнения
у меня есть Post
модель, которая требует отправки письма модераторам, если оно обновлено и удалено.
# Post Model
class Post < ActiveRecord::Base
# Table name: posts
#
# id :integer
# title :string
# body :text
# created_at :datetime
# updated_at :datetime
before_save :email_mod_post_updated, :email_mod_post_deleted
private
def email_mod_post_updated
ModeratorMailerJob.updated_post_email(self).deliver_later
end
def email_mod_post_deleted
ModeratorMailerJob.deleted_post_email(self).deliver_later
end
end
# ModeratorMailer
class ModeratorMailer < ApplicationMailer
default from: "Mod <mod@domain.com>"
def updated_post_email(post)
@post = post
mail(to: "mod@domain.com", subject: "Post Updated - #{@post.title}")
end
def deleted_post_email(post)
@post = post
mail(to: "mod@domain.com", subject: "Post Deleted - #{@post.title}")
end
end
Текущий ActiveJob
настроить:
# app/jobs/updated_post_email_job.rb
class UpdatedPostEmailJob < ActiveJob::Base
queue_as :default
def perform(post)
ModeratorMailer.updated_post_email(post)
end
end
# app/jobs/deleted_post_email_job.rb
class DeletedPostEmailJob < ActiveJob::Base
queue_as :default
def perform(post)
ModeratorMailer.deleted_post_email(post)
end
end
Вопрос 1: с deliver_later
метод, это по-прежнему реле при настройке ActiveJob
например. app/jobs/updated_post_email_job.rb
или это не обязательно (у меня есть delayed_job
работает в фоновом режиме)?
Будет ли это так же, как звонить ModeratorMailerJob.perform_later(post)
Вопрос 2: Добавляют ли люди несколько методов исполнения в свои активные работы, например:
class EmailModeratorJob < ActiveJob::Base
queue_as :default
def perform(post)
ModeratorMailer.updated_post(post)
end
def perform(post)
ModeratorMailer.deleted_post(post)
end
end
или лучше иметь отдельную работу для конкретной задачи?
1 ответ
ActiveJob и почтовые программы:
- Настройте ActiveJob с адаптером, который соответствует вашим потребностям.
- Определите свою почтовую программу различными методами (1 по типу отправляемой вами почты)
- использование
deliver_later
метод на вашем почтовике. Он отправит вашу почту в асинхронном задании через настроенный адаптер. - Это все!
Вам не нужно определять 1 работу на почту, это бесполезно.
Чтобы ответить на ваши вопросы:
- Уже ответил выше
- Вы не должны иметь несколько методов с одним и тем же именем в одном классе: каждое задание должно иметь один
perform
метод, который делает работу.