2010-08-22 54 views
1

我閱讀了關於workers和delayed_job的文檔,但無法完全遵循,因此想要從一些策略和示例代碼中獲得先機。如何在heroku上使用delayed_job發送批量處理的電子郵件?

我有一個控制器,我用它來逐一發送郵件。現在,我每天都要查看哪天需要發送哪些電子郵件,然後通過heroku將其作爲delayed_job發送。

我該如何開始接近這個?謝謝。

這是基於問題的答案是什麼,我來了:

使用「每當」的寶石,我創建了以下schedule.rb

every 1.day, :at => '4:30 am' do 

    heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS']) 
    heroku.set_workers(ENV['HEROKU_APP'], 1) 

    Contact.all.each do |contact| 
     contact_email = contact.email_today 

     unless contact.email_today == "none" 
     puts contact.first_name 
     puts contact_email.days 
     puts contact.date_entered 

     Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email) 
     end 

    end 

    heroku.set_workers(ENV['HEROKU_APP'], 0) 
    end 

要確定是否我應該發送電子郵件或不,我創建contact.rb的方法:

def email_today 

    next_event_info = self.next_event_info # invokes method for contact 

    next_event = next_event_info[:event] 
    delay = next_event_info[:delay] 

    if next_event.class.name == "Email" && from_today(self, next_event.days) + delay < 0 #helper from_today 
     return next_event  
    else 
     return "none" 
    end 

    end 

這種設計比較合適嗎?我在Windows上開發並部署到heroku,所以不知道如何測試它......謝謝!

回答

3

如果您每天發送一次電子郵件,您可能首先需要將cron addon添加到您的應用程序,該應用程序每天會觸發一次耙子任務。

顯然,您還需要添加delayed_job插件(http://docs.heroku.com/delayed-job)。另外,您的應用將需要至少運行一名工作人員。

然後這只是一個在你的cron rake任務中做郵件工作的問題。舉例來說,如果你有一個名爲「UserMailer」郵件,你的cron可能看起來是這樣的:如果你只使用後臺任務來發送這些電子郵件

#lib/cron.rb 
task :cron => :environment do 
    User.all.each do |user| 
    Delayed::Job.enqueue UserMailer.deliver_notification(user) 
    end 
end 

,你很可能也添加一些邏輯,在你的cron任務,以及根據需要添加和刪除工作人員的郵件程序方法,這樣可以節省您在工作人員不使用時爲其付費。

+0

我可以測試我的本地windwos環境的cron功能嗎?有沒有辦法從控制器中添加工作人員(與使用控制檯相比)? – Angela 2010-08-24 03:14:03

+0

我試圖打開和關閉這個工作的工人(所以我不會繼續支付)......不知道它是否正確....您怎麼看? – Angela 2010-08-24 04:22:57

+0

查看佩德羅的延遲工作分叉,其中包括自動縮放heroku工人。 http://github.com/pedro/delayed_job/tree/autoscaling – mark 2010-08-24 06:38:30