活动作业 - 如何取消计划的Action Mailer作业?

时间:2016-01-26 21:38:57

标签: actionmailer delayed-job ruby-on-rails-4.2 rails-activejob

我使用延迟作业作为Active Job的排队后端。我没有设置任何自定义作业,并计划异步使用Action Mailer到send out scheduled emails。如何防止发送预定的电子邮件?

例如,假设用户可以在我的应用程序上设置电子邮件提醒。如果用户将来设置三天的提醒,则将创建一个作业。如果用户删除了该电子邮件提醒,则应删除该作业。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

我决定以不同方式解决问题。我只是简单地安排工作,而不是安排工作并销毁它。

当用户将来设置三天的提醒时,就会像以前一样创建一个作业。如果用户删除了电子邮件提醒,则该作业仍将在三天内运行,但不会执行任何操作。这是一个示例设置:

# controllers/users_controller.rb

def schedule_reminder
  # Get the user that scheduled the reminder
  user = User.find_by_id(params[:id])

  # Create a reminder for the user
  reminder = user.reminders.create(active: true)

  # Schedule the reminder to be sent out
  SendReminderJob.set(wait_until: 3.days.from_now).perform_later(reminder.id)
end

def unschedule_reminder
  reminder = Reminder.find_by_id(params[:reminder_id])

  reminder.destroy
end

当用户安排提醒时,会执行def schedule_reminder。此方法会创建提醒并安排将在3天内运行的作业。它将提醒的ID作为参数传递,以便作业可以在运行时检索提醒。

当用户删除提醒时,执行def unschedule_reminder。此方法查找提醒并删除它。

这是我的SendReminderJob工作的样子:

# jobs/send_reminder_job.rb

class SendReminderJob < ActiveJob::Base
  queue_as :default

  def perform(*args)
    # Get the reminder
    # args.first is the reminder ID
    reminder = Reminder.find_by_id(args.first)

    # Check if the reminder exists
    if !reminder.nil?
      # Send the email to the user

    end
  end
end

当此作业在三天内运行时,它会检查提醒是否仍然设置。如果是,它会向用户发送一封电子邮件。否则,它什么都不做。无论它是否做任何事情,这项工作将在三天后删除!

答案 1 :(得分:1)

我创建了app / models / delayed_backend_mongoid_job.rb。

class DelayedBackendMongoidJob
  include Mongoid::Document    
  field :priority,      type: Integer
  field :attempts,      type: Integer
  field :queue,         type: String
  field :handler,       type: String
  field :run_at,        type: DateTime
  field :created_at,    type: DateTime
  field :updated_at,    type: DateTime
end

如果您使用的是ActiveRecord,则需要调整模型文件。然后我安装了rails_admin,我可以查看/编辑该表中的任何记录。

如果你的工作计划在2天内完成,那么你所要做的就是删除记录,DJ永远不会拿起它。