2010-09-17 48 views
1

我有一個delayed_job旨在使用郵件發送電子郵件。只有在delayed_job成功完成後,我如何才能保存對象?

完成後,我需要記錄電子郵件已發送 - 我通過保存新創建的ContactEmail來完成此操作。

現在,即使delayed_job失敗,新的ContactEmail記錄也會被保存。

我該如何解決這個問題,以便只有在郵件發送成功後才保存新的ContactEmail?

下面是它調用的delayed_job的定期任務的片段:

puts contact_email.subject 

    contact_email.date_sent = Date.today 
    contact_email.date_created = Date.today 

    contact_email.body = email.substituted_message(contact, contact.colleagues) 

    contact_email.status = "sent" 

    #Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email) 
    Delayed::Job.enqueue SomeMailJob.new(contact,contact_email) 

    contact_email.save #now save the record 

這裏是some_mail_job.rb

class SomeMailJob < Struct.new(:contact, :contact_email) 
    def perform 
    OutboundMailer.deliver_campaign_email(contact,contact_email) 
    end 
end 

這裏是outbound_mailer:

class OutboundMailer < Postage::Mailer 

    def campaign_email(contact,email) 
    subject email.subject 
    recipients contact.email 
    from  '<[email protected]>' 
    sent_on Date.today 

    body  :email => email 
    end 

回答

-1
  1. 你需要sy因此在這種情況下停止使用延遲作業,並執行標準的郵件發送。
  2. 或添加success列到你ContactEmail - initialy與false保存它,然後在工作更新到true
+0

所以保存它,它運行的delayed_job之前(它是我在Heroku上運行它的delayed_job) ---延遲作業中的實例是否持久? – Angela 2010-09-17 14:40:15

+0

我不知道你是由heroku綁定到delayed_job。因爲你已經有狀態欄只是更新作業中的狀態,或者將它保存在作業中而不是cron任務中。 – gertas 2010-09-17 21:34:04

0

你可以更新工作本身的執行狀態。

例如,像:

contact_email.status = 'queued' 
contact_email.save 
contact_email.delay.deliver_campaign_email 

,然後在ContactEmail類的東西

def deliver_campaign_email 
    OutboundMailer.deliver_campaign_email(self.contact, self) 
    self.status = 'sent' # or handle failure and set it appropriately 
    self.save 
end 

的delayed_job的效果有一些神奇位,它添加到您的模式,將處理持之以恆。

爲了對付你OutboundMailer拋出一個異常,你可以做一些像這樣:

def deliver_campaign_email 
    begin 
    OutboundMailer.deliver_campaign_email(self.contact, self) 
    self.status = 'sent' 
    rescue 
    self.status = 'failed' # or better yet grab the the message from the exception 
    end 
    self.save 
end 
+0

我明白了...當我做contact_email.save - 創建「記錄」,這意味着它已成功保存...所以我真的不能在發送電子郵件之前把它.....如果我刪除從執行方法(這是我認爲你的意思是?)的線將成功完成後工作嗎?如果OutboundMailer失敗會發生什麼? – Angela 2010-09-17 23:31:13

+0

OutboundMailer失敗引發異常,從而停止方法調用而不處理進一步的語句 – gertas 2010-09-18 16:13:03

+0

您需要挽救該異常。 – 2010-09-18 20:09:52

相關問題