do you agree that for having scheduled tasks in Rails, the leanest
solution is the following?
- Create a controller with an action for each task
- Implement the logic of the task as controller code
- Set up a cron job at the OS level that uses wget to invoke the URL of
this controller/action at the appropriate time intervals
Advantages:
1) full access to all your Rails objects just as in a normal controller
2) you can develop and test just as you do normal actions
3) you can also invoke your tasks adhoc from a simple web page
4) You don't consume any more memory by firing up additional ruby/rails
processes
My additional question is: How would the cron job entry have to look
like in order to let cron "log in" (as admin for example) before calling
the action (for obvious security reasons)? This is what I have until
now:
My additional question is: How would the cron job entry have to look
like in order to let cron "log in" (as admin for example) before calling
the action (for obvious security reasons)? This is what I have until
now:
One solution is to use HTTP Basic Authentication and curl (wget may be able to
do this, I just know abt curl). Also, check for local_request? in the
controller (i.e., request is coming from the same computer).
Tom,
I think every scheduled task I've seen has called methods on models,
not controller actions. Here are some ways I've seen it done:
1) Sometimes, for cron jobs run in production, folks will do a
"{#RAILS_ROOT}/script/runner -e production 'Model.method' >> /dev/null
2>&1"
2) There's repeated_job by ddollar: http://github.com/ddollar/repeated_job.
It uses delayed_job, which is pretty sweet.
3) Adam Wiggins wrote a recent blog post about the shortcomings of
cron: http://adam.heroku.com/past/2010/4/13/rethinking_cron/. He
suggests a combination of rufus-scheduler and Minion+RabbitMQ.