2009-02-16 9 views
10

Günlük bir görev planlamak istiyorum: her gün saat 7'de, e-posta gönderilmesini istiyorum (insan müdahalesi olmadan).Gönderme e-posta görevini Ruby on Rails ile planlamanın en iyi yolu nedir?

RoR çerçevesi üzerinde çalışıyorum ve bunu yapmanın en iyi yolunun ne olduğunu merak ediyorum.

BackgrounDRB, OpenWFEru zamanlayıcıyı veya Cron'u temel alan şeyleri duydum, fakat yeni bir kullanıcıyım ve hangisinin benim ihtiyacım için yapıldığını anlamıyorum.

cevap

12

Bir başka seçenek, bir cron işi tarafından çalıştırılan bir komisyon görevi oluşturmaktır. Bunu yapmak için, some_file.rake bir dosya oluşturun ve lib/tasks klasörünüze yerleştirin. Dosyanız aşağıdaki gibi görünebilir:

Raylar 2.x:

task :send_daily_mail, :needs => :environment do 
    Model.send_daily_mail 
end 

Raylar 3.x:

task :send_daily_mail => :environment do 
    Model.send_daily_mail 
end 

Sonra istediğiniz sıklıkta olarak yürütmek için cron'u kullanın:

cd /path/to/app && /usr/bin/rake send_daily_mail 

Uygulamanız geliştirme modundaysa varsayılan olarak RAILS_ENV=production kodunu crontab'a eklemeniz gerekebileceğini unutmayın.

+0

Bunun için garip bir problemim var: "cd/yol/to/app &&/usr/local/bin/rake send_daily_mail" komut satırından çalıştırdığımda çalışır. Ama crontab icra etmeye çalıştığında, "/ usr/local/bin/rake: 9: 'need' hatası var: Yüklemek için böyle bir dosya yok - rubygems (LoadError)"/usr/local/bin/rake : 9 " – Flackou

+0

Cron görevleri, kullanıcıların tam oturum ortamının yararı olmadan varsayılan olarak çalışır. Benim için çalışan crontab: */5 * * * * bash --login -c 'cd/yol/to/app && tır 'send_daily_mail – wonderfulthunk

1

Modellerinizden birine, sizin için işleyecek bir sınıf yöntemi ekleyin. Şimdi bu yöntemin, runner betiği 10'u çalıştırmayı deneyin. Eğer öyleyse, o zaman projeye doğru yolu kurarak komutun evrensel olarak çalışması gerekir.

Şimdi rastgele bir yönlendiriciye geçin ve bu komutu çalıştırın. Düzgün çalışıyorsa, crontab -e'u çalıştırın ve komutu, her gün 7AM'de çalıştırmak için kurulumuna ekleyin. Onlar için google eğer orada cron biçimi hakkında bir açıklama tonu vardır ve anlamaya oldukça basit olmalıdır. Oldukça basit görünüyor ..which

scheduler = Rufus::Scheduler.start_new 

scheduler.every("1m") do 
    DailyDigest.send_digest! 
end 

:

+0

Bu cevap için çok teşekkür ederim.Bir modelin yönteminden ziyade belirli bir dosyadan (lib/tasks/send_mail.rb gibi) yönetilmesi mümkün müdür? – Flackou

7

Ben rufus-scheduler mücevher O böyle bir şey anlatır in this blog post

tartışılan etkiledi (ve denemek için plan) oldu. HTML tabanlı yapılandırma eklemek ne kadar kolay olurdu acaba?

+1

? Denedin mi, sen ne düşündün? –

2

Arka planRB kullanıyorum ve mükemmel çalışıyor. BackgroundRB tarafından üretilen birkaç e-posta adresim var. Ayrıca başka görevlerim var. Çünkü hem zamanlanmış görevler hem de eşzamansız görevler (normal istemci/sunucu yanıt döngüsünden daha uzun süren görevler) sağlar.

Kullanıyorum ve çok mutluyum.

0

Kabul edilen yanıtın zaten söylediği gibi bir komisyon görevi ve cron işi ile devam edin. Ancak, cron dosyasının kendisini güncellemesinin manuel bir görev olduğunu unutmayın. Geliştirme sırasında değiştirmiyorsanız bu iyi olabilir. Aksi takdirde, burada Capistrano'nun sizin için yapmasını nasıl sağlayabilirsiniz: http://push.cx/2008/deploying-crontab-with-your-rails-app