活动作业 - 如何取消预定的 Action Mailer 作业?
Active Job - How to cancel a scheduled Action Mailer job?
我正在使用延迟作业作为活动作业的排队后端。我还没有设置任何自定义作业并计划异步使用 Action Mailer send out scheduled emails。如何防止发送预定的电子邮件?
例如,假设用户可以在我的应用程序上设置电子邮件提醒。如果用户设置了未来三天的提醒,就会创建一个工作。如果用户删除该电子邮件提醒,则应删除该作业。
如有任何帮助,我们将不胜感激!
我创建了 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,我可以 view/edit 那个 table 中的任何记录。
如果您有一项工作安排在 2 天内 运行,您只需删除记录,DJ 将永远不会接收它。
我决定以不同的方式处理这个问题。我不是安排一个工作然后销毁它,而是简单地安排一个工作。
当用户设置未来三天的提醒时,将创建一个工作,就像以前一样。如果用户删除电子邮件提醒,该作业将在三天后仍然 运行 但不会执行任何操作。这是一个示例设置:
# 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 作为参数传递,以便作业可以在 运行s.
时检索提醒
当用户删除提醒时,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
三天后此作业 运行s 时,它会检查是否仍设置了提醒。如果是,它会向用户发送一封电子邮件。否则,它什么都不做。不管有没有做,三天后这个帖子就删了!
我正在使用延迟作业作为活动作业的排队后端。我还没有设置任何自定义作业并计划异步使用 Action Mailer send out scheduled emails。如何防止发送预定的电子邮件?
例如,假设用户可以在我的应用程序上设置电子邮件提醒。如果用户设置了未来三天的提醒,就会创建一个工作。如果用户删除该电子邮件提醒,则应删除该作业。
如有任何帮助,我们将不胜感激!
我创建了 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,我可以 view/edit 那个 table 中的任何记录。
如果您有一项工作安排在 2 天内 运行,您只需删除记录,DJ 将永远不会接收它。
我决定以不同的方式处理这个问题。我不是安排一个工作然后销毁它,而是简单地安排一个工作。
当用户设置未来三天的提醒时,将创建一个工作,就像以前一样。如果用户删除电子邮件提醒,该作业将在三天后仍然 运行 但不会执行任何操作。这是一个示例设置:
# 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 作为参数传递,以便作业可以在 运行s.
当用户删除提醒时,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
三天后此作业 运行s 时,它会检查是否仍设置了提醒。如果是,它会向用户发送一封电子邮件。否则,它什么都不做。不管有没有做,三天后这个帖子就删了!