Rails延迟工作连续运行

时间:2013-03-10 06:00:39

标签: ruby-on-rails delayed-job

我为我的网站创建了批量电子邮件系统。我遇到的问题很糟糕,它不断发送电子邮件。似乎这项工作陷入了无限循环。请指教。这很疯狂,因为在我的开发服务器上,每个帐户只发送一封电子邮件,但在我的生产服务器上,我收到了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

请提供有关此方法的反馈。我想将批量电子邮件发送给所有用户,但如果出现问题,请避免多次重试。我添加了救援块以捕获电子邮件异常,希望批处理将跳过错误并继续处理。如果出现其他问题,请不要再次使用。

1 个答案:

答案 0 :(得分:2)

在数百万封电子邮件之后,我的应用程序似乎能够完美运行:

1)在初始化程序中,不要让DelayedJob重新尝试失败的作业,也不要让DJ删除失败的作业:

Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.max_attempts = 1

2)安排群发电子邮件是一项工作,即“主要工作”

3)当作业运行时,它会产生N个作业,其中N是发送的电子邮件数量。所以每封电子邮件都有自己的工作。 (注意:如果您使用具有“批量”功能的生产电子邮件服务,则一封“电子邮件”实际上可能是一批100或1000封电子邮件。)

4)我们有一个管理面板,告诉我们是否有任何失败的工作,如果他们是,因为我们不删除它们,我们可以检查失败的工作,看看发生了什么(格式错误的电子邮件地址等)< / p>

如果一封电子邮件失败,则其他电子邮件不受影响。并且不能再发送两次电子邮件。