我为我的网站创建了批量电子邮件系统。我遇到的问题很糟糕,它不断发送电子邮件。似乎这项工作陷入了无限循环。请指教。这很疯狂,因为在我的开发服务器上,每个帐户只发送一封电子邮件,但在我的生产服务器上,我收到了5封电子邮件。因此,意味着我网站的所有用户都收到了多封电子邮件。
控制器:
class BatchEmailsController < ApplicationController
before_filter :authenticate_admin_user!
def deliver
flash[:notice] = "Email Being Delivered"
Delayed::Job.enqueue(BatchEmailJob.new(params[:batch_email_id]), 3, 10.seconds.from_now, :queue => 'batch-email', :attempts => 0)
redirect_to admin_batch_emails_path
end
end
lib文件夹中的作业:
class BatchEmailJob < Struct.new(:batch_email_id)
def perform
be = BatchEmail.find(batch_email_id)
if be.to.eql?("Contractors")
cs = Contractor.all
cs.each do|c|
begin
BatchEmailMailer.batch_email(be.subject, be.message, be.link_name, be.link_path, be.to, c.id).deliver
rescue Exception => e
Rails.logger.warn "Batch Email Error: #{e.message}"
end
else
ps = Painter.all
ps.each do |p|
begin
BatchEmailMailer.batch_email(be.subject, be.message, be.link_name, be.link_path, be.to, p.id).deliver
rescue Exception => e
Rails.logger.warn "Batch Email Error: #{e.message}"
end
end
end
end
end
延迟作业初始化程序:
Delayed::Worker.max_attempts = 0
请提供有关此方法的反馈。我想将批量电子邮件发送给所有用户,但如果出现问题,请避免多次重试。我添加了救援块以捕获电子邮件异常,希望批处理将跳过错误并继续处理。如果出现其他问题,请不要再次使用。
答案 0 :(得分:2)
在数百万封电子邮件之后,我的应用程序似乎能够完美运行:
1)在初始化程序中,不要让DelayedJob重新尝试失败的作业,也不要让DJ删除失败的作业:
Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.max_attempts = 1
2)安排群发电子邮件是一项工作,即“主要工作”
3)当作业运行时,它会产生N个作业,其中N是发送的电子邮件数量。所以每封电子邮件都有自己的工作。 (注意:如果您使用具有“批量”功能的生产电子邮件服务,则一封“电子邮件”实际上可能是一批100或1000封电子邮件。)
4)我们有一个管理面板,告诉我们是否有任何失败的工作,如果他们是,因为我们不删除它们,我们可以检查失败的工作,看看发生了什么(格式错误的电子邮件地址等)< / p>
如果一封电子邮件失败,则其他电子邮件不受影响。并且不能再发送两次电子邮件。