Задержка почты с 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 и почтовые программы:

  1. Настройте ActiveJob с адаптером, который соответствует вашим потребностям.
  2. Определите свою почтовую программу различными методами (1 по типу отправляемой вами почты)
  3. использование deliver_later метод на вашем почтовике. Он отправит вашу почту в асинхронном задании через настроенный адаптер.
  4. Это все!

Вам не нужно определять 1 работу на почту, это бесполезно.

Чтобы ответить на ваши вопросы:

  1. Уже ответил выше
  2. Вы не должны иметь несколько методов с одним и тем же именем в одном классе: каждое задание должно иметь один perform метод, который делает работу.
Другие вопросы по тегам