jobs scheduling

I know, that my question is easy for you, but not for me, because I'm beginner with RoR. So... My application sends a lot of emails - not only for confirm registration, change password, but others. I take time if I do this by request. My application also creates many files - it takes a time too... Is there a good way for sending email in background? Is there a good way for scheduling jobs?

Thanks for help?

Two best I have personally found are backgroundrb and spawn:

http://spawn.rubyforge.org/svn/spawn/ http://backgroundrb.rubyforge.org/

With spawn, scheduling a background (deferred) task is about as simple as can be:

spawn do     # do whatever you want in here (rails environment is loaded)   end

If you want recurring job or more finetuned control, you can use backgroundrb which is as simple as

1) generate a worker 2) code the worker to do a task 3) Invoke the worker task with the syntax (roughly):

MiddleMan(:worker_name).task_name(args)

Thanks. I found this: http://railspikes.com/2008/6/3/asynchronous-railsconf-2008, It's interesting, but not everything is clear for me... Maybe someone know more about this solutions?

Nathan - spawn works perfect :wink: Thanks a lot! Do you know something about cornedit?

Anka,

Emails are really sent in the background since they will be queued by sendmail or similar. If you plan on sending a ton of emails in one request, I would suggest setting something up with crontab to execute at timed intervals.

You can create a model and put your logic in there and then add a crontab entry

RAILS_ROOT/lib/my_script_model.rb

Fredrik,

I said, that emails are sent in the background so why request is longer than when I use spawn? It can be other reason?

and question about crontab: Generally the idea is clear, but tell me, how my some_method invoked in crontab knows which email should be send? Should I use e.g. table jobs, where I put information which email and to whom it should me send? And some_method should checking this jobs?

It's hard to explain and asking in English :wink:

That's usually what I do when cron is sufficient, yes. I like the "queued_" prefix for table names for this kind of thing, e.g. "queued_emails".

Ciao, Sheldon.