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

class MyScriptModel < ActiveRecord::Base
def self.some_method
Generate all the emails here
end
end

Crontab

RAILS_ENV=production
0 * * * * some_user RAILS_ROOT/script/runner MyScriptModel.some_method

Something along these lines should get you started.

There are certainly other solutions, but I think this would be fairly
easy to get going.

-Fredrik

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Thursday 05 June 2008 09:06:22 Anka Gr wrote:

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?

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.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFIR9hvpGJX8XSgas0RAm3vAJ99xDdoFplsGdzZf44LRhXXRO0v0QCgok8y
niUZR8OwRDVM6XrhBcIm0sw=
=O1aW
-----END PGP SIGNATURE-----

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: