2009-02-16 34 views
10

Tôi muốn lên lịch một công việc hàng ngày: mỗi ngày vào lúc 7 giờ sáng, tôi muốn một email được gửi đi (không có sự can thiệp của con người).Cách tốt nhất để lên lịch tác vụ gửi email bằng Ruby on Rails là gì?

Tôi đang làm việc trên khung công tác RoR và tôi tự hỏi cách tốt nhất để làm điều đó là gì?

Tôi đã nghe nói về BackgrounDRB, trình lên lịch OpenWFEru hoặc những thứ dựa trên Cron, nhưng tôi là người mới và không hiểu cái nào được tạo cho nhu cầu của tôi.

Trả lời

12

Tùy chọn khác là tạo tác vụ cào được điều hành bởi công việc cron. Để thực hiện việc này, hãy tạo một tệp some_file.rake và đặt nó trong thư mục lib/tasks của bạn. tập tin của bạn có thể trông như thế này:

Rails 2.x:

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

Rails 3.x:

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

Sau đó sử dụng cron để thực hiện nó thường xuyên như bạn thích:

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

Lưu ý rằng bạn có thể cần phải đặt RAILS_ENV=production trong crontab nếu ứng dụng của bạn đang ở chế độ phát triển theo mặc định.

+0

Tôi có một vấn đề lạ với điều này: khi tôi thực thi "cd/path/to/app &&/usr/local/bin/rake send_daily_mail" từ dòng lệnh, nó hoạt động. Nhưng khi crontab cố gắng thực hiện nó, tôi có lỗi "/ usr/local/bin/rake: 9: in' require ': Không có tệp nào để tải-- rubygems (LoadError) "từ/usr/local/bin/rake : 9 " – Flackou

+0

Tác vụ Cron chạy theo mặc định mà không có lợi ích của môi trường đăng nhập đầy đủ của người dùng. Crontab hoạt động với tôi là: */5 * * * * bash --login -c 'cd/path/to/app && rake send_daily_mail ' – wonderfulthunk

1

Thêm phương thức lớp vào một trong các mô hình của bạn sẽ xử lý việc này cho bạn. Bây giờ, hãy thử thực hiện phương thức đó bằng cách sử dụng tập lệnh runner

./script/runner "MyModel.send_daily_mail" RAILS_ENV=production 

Đảm bảo mọi thứ đều hoạt động tốt. Nếu có, thì chúng ta cần phải làm cho lệnh hoạt động phổ biến bằng cách thiết lập đường dẫn đến dự án đúng cách.

cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production 

Bây giờ chuyển sang bất kỳ lệnh ngẫu nhiên nào và chạy lệnh đó. Nếu nó chạy đúng cách, hãy chạy crontab -e và chèn lệnh trong đó thiết lập để chạy hàng ngày lúc 7 giờ sáng. Có một tấn giải thích về định dạng cron trên đó nếu bạn google cho họ và nên được khá đơn giản để tìm ra.

+0

Cảm ơn bạn rất nhiều vì câu trả lời này.Có thể quản lý nó từ một tệp cụ thể (như lib/tasks/send_mail.rb) thay vì trong phương thức của mô hình không? – Flackou

7

tôi đã rất ấn tượng bởi (và có kế hoạch thử) các rufus-scheduler ngọc thảo luận in this blog post

Ông mô tả một cái gì đó như thế này:

scheduler = Rufus::Scheduler.start_new 

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

đồi khế, đồi có vẻ khá đơn giản. Tôi tự hỏi việc thêm cấu hình dựa trên HTML dễ dàng như thế nào?

+1

như vậy? Bạn đã thử nó, bạn nghĩ gì? –

2

BackgroundRB là những gì tôi sử dụng và nó hoạt động hoàn hảo. Tôi có một số email được gửi, được tạo bởi BackgroundRB. Tôi cũng có các nhiệm vụ khác. Bởi vì nó cho phép cả nhiệm vụ được lập biểu và nhiệm vụ không đồng bộ (nhiệm vụ mất nhiều thời gian hơn chu kỳ phản hồi máy khách/máy chủ thông thường).

Tôi sử dụng nó và tôi rất hài lòng với nó.

0

Đi với tác vụ cào và công việc cron, như câu trả lời được chấp nhận đã nói. Tuy nhiên, lưu ý rằng, việc cập nhật tệp cron chính nó là một nhiệm vụ thủ công. Điều đó có thể tốt nếu bạn không thay đổi nó trong quá trình phát triển. Nếu không, ở đây cách bạn có thể cho phép Capistrano làm điều đó cho bạn: http://push.cx/2008/deploying-crontab-with-your-rails-app

Các vấn đề liên quan