2013-03-10 81 views
0

我爲我的網站創建了一個批量電子郵件系統。我遇到的問題非常糟糕,它不斷髮送電子郵件。看來這項工作陷入了無限循環。請指教。這很瘋狂,因爲在我的開發服務器上,每個帳戶只發送一封電子郵件,但在我的生產服務器上,我收到了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

該作業可能在某處重新啓動作業時遇到了錯誤。 – jvnill 2013-03-10 06:05:51

+0

jvnill,我該如何防止這種情況發生,並繼續發送電子郵件?根據你的說法,我認爲這與交付失敗有關。 – Brian 2013-03-10 06:10:44

+0

您需要在batch_emails上添加標誌,該標誌跟蹤電子郵件是否已處理,以便它不會再次發送。 – jvnill 2013-03-10 06:32:52

回答

2

什麼我的應用程序之一,並似乎以百萬計的電子郵件後,工作得很好:

1)在初始化,不要讓DelayedJob重新嘗試失敗的作業並且也不讓DJ刪除失敗的作業:

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

2)安排羣發電子郵件是1個作業,也稱爲「主作業」

3)當喬布斯運行時,它產生n個工件,其中N爲所發送的電子郵件數量。所以每封電子郵件都有自己的工作。 (注意:如果您使用具有「批量」功能的生產電子郵件服務,則其中一個「電子郵件」實際上可能是一批100或1000封電子郵件。)

4)我們有一個管理面板,顯示我們是否有任何失敗的工作,如果他們是,因爲我們不刪除他們,我們可以檢查失敗的工作,看看發生了什麼(畸形的電子郵件地址等)

如果一封電子郵件失敗,其他人不受影響。沒有電子郵件可以發送兩次。