README.markdown in simple_worker-0.3.20 vs README.markdown in simple_worker-0.3.21

- old
+ new

@@ -1,218 +1,237 @@ -Getting Started -=============== - -[Sign up for a SimpleWorker account][1], it's free to try! - -[1]: http://www.simpleworker.com/ - -Configure SimpleWorker ----------------------- - -You really just need your access keys. - - SimpleWorker.configure do |config| - config.access_key = ACCESS_KEY - config.secret_key = SECRET_KEY - end - -Write a Worker --------------- - -Here's an example worker that sends an email: - - require 'simple_worker' - - class EmailWorker < SimpleWorker::Base - - attr_accessor :to, :subject, :body - - # This is the method that will be run - def run - send_email(:to=>to, :subject=>subject, :body=>body) - end - - def send_email - # Put sending code here - end - end - -Test It Locally ---------------- - -Let's say someone does something in your app and you want to send an email about it. - - worker = EmailWorker.new - worker.to = current_user.email - worker.subject = "Here is your mail!" - worker.body = "This is the body" - worker.run_local - -Once you've got it working locally, the next step is to run it on the SimpleWorker cloud. - -Queue up your Worker on the SimpleWorker Cloud ----------------------------------------------- - -Let's say someone does something in your app and you want to send an email about it. - - worker = EmailWorker.new - worker.to = current_user.email - worker.subject = "Here is your mail!" - worker.body = "This is the body" - worker.queue - -This will send it off to the SimpleWorker cloud. - -Schedule your Worker --------------------- - -There are two scenarios here, one is the scenario where you want something to happen due to a user -action in your application. This is almost the same as queuing your worker. - - worker = EmailWorker.new - worker.to = current_user.email - worker.subject = "Here is your mail!" - worker.body = "This is the body" - worker.schedule(:start_at=>1.hours.since) - -Check Status ------------- - -If you still have access to the worker object, just call: - - worker.status - -If you only have the job ID, call: - - SimpleWorker.service.status(job_id) - -This will return a hash like: - - {"task_id"=>"ece460ce-12d8-11e0-8e15-12313b0440c6", - "status"=>"running", - "msg"=>nil, - "start_time"=>"2010-12-28T23:19:36+00:00", - "end_time"=>nil, - "duration"=>nil, - "progress"=>{"percent"=>25}} - - -Logging -------- - -In your worker, just call the log method with the string you want logged: - - log "Starting to do something..." - -The log will be available for viewing via the SimpleWorker UI or via log in the API: - - SimpleWorker.service.log(job_id) - -Setting Progress ----------------- - -This is just a way to let your users know where the job is at if required. - - set_progress(:percent => 25, :message => "We are a quarter of the way there!") - -You can actually put anything in this hash and it will be returned with a call to status. We recommend using -the format above for consistency and to get some additional features where we look for these values. - -Schedule a Recurring Job - CRON ------------------------------- - -The alternative is when you want to user it like Cron. In this case you'll probably -want to write a script that will schedule, you don't want to schedule it everytime your -app starts or anything so best to keep it external. - -Create a file called 'schedule_email_worker.rb' and add this: - - require 'simple_worker' - require_relative 'email_worker' - - worker = EmailWorker.new - worker.to = current_user.email - worker.subject = "Here is your mail!" - worker.body = "This is the body" - worker.schedule(:start_at=>1.hours.since, :run_every=>3600) - -Now run it and your worker will be scheduled to run every hour. - -SimpleWorker on Rails ---------------------- - -Rails 2.X: - - config.gem 'simple_worker' - -Rails 3.X: - - gem 'simple_worker' - -Now you can use your workers like they're part of your app! We recommend putting your worker classes in -/app/workers path. - -Configuring a Database Connection ---------------------------------- - -Although you could easily do this in your worker, this makes it a bit more convenient and more importantly -it will create the connection for you. If you are using ActiveRecord, you would add the following to your -SimpleWorker config: - - config.database = { - :adapter => "mysql2", - :host => "localhost", - :database => "appdb", - :username => "appuser", - :password => "secret" - } - -Then before you job is run, SimpleWorker will establish the ActiveRecord connection. - -Including/Merging other Ruby Classes ------------------------------------- - -If you are using the Rails setup above, you can probably skip this as your models will automatically be merged. - - class AvgWorker < SimpleWorker::Base - - attr_accessor :aws_access_key, - :aws_secret_key, - :s3_suffix - - merge File.join(File.dirname(__FILE__), "..", "app", "models", "user.rb") - merge File.join(File.dirname(__FILE__), "..", "app", "models", "account") - -Or simpler yet, try using relative paths: - - merge "../app/models/user" - merge "../app/models/account.rb" - -The opposite can be done as well with "unmerge" and can be useful when using Rails to exclude classes that are automatically -merged. - - -Bringing in other Workers ---------------------- - -merge_worker -TODO - - -Configuration Options ---------------------- - -### Global Attributes - -These are attributes that can be set as part of your config block then will be set on -all your worker objects automatically. This is particularly good for things like database -connection info or things that you would need to use across the board. - -Eg: - - config.global_attributes[:db_user] = "sa" - config.global_attributes[:db_pass] = "pass" - -Then in your worker, you would have the attributes defined: - - attr_accessor :db_user, :db_pass - +Getting Started +=============== + +[Sign up for a SimpleWorker account][1], it's free to try! + +[1]: http://www.simpleworker.com/ + +Install SimpleWorker Gem +------------------------ + + gem install simple_worker + +Configure SimpleWorker +---------------------- + +You really just need your access keys. + + SimpleWorker.configure do |config| + config.access_key = ACCESS_KEY + config.secret_key = SECRET_KEY + end + +Write a Worker +-------------- + +Here's an example worker that sends an email: + + require 'simple_worker' + + class EmailWorker < SimpleWorker::Base + + attr_accessor :to, :subject, :body + + # This is the method that will be run + def run + send_email(:to=>to, :subject=>subject, :body=>body) + end + + def send_email + # Put sending code here + end + end + +Test It Locally +--------------- + +Let's say someone does something in your app and you want to send an email about it. + + worker = EmailWorker.new + worker.to = current_user.email + worker.subject = "Here is your mail!" + worker.body = "This is the body" + worker.run_local + +Once you've got it working locally, the next step is to run it on the SimpleWorker cloud. + +Queue up your Worker on the SimpleWorker Cloud +---------------------------------------------- + +Let's say someone does something in your app and you want to send an email about it. + + worker = EmailWorker.new + worker.to = current_user.email + worker.subject = "Here is your mail!" + worker.body = "This is the body" + worker.queue + +This will send it off to the SimpleWorker cloud. + +Setting Priority +---------------------------------------------- + +Simply define the priority in your queue command. + + worker.queue(:priority=>1) + +Default priority is 0 and we currently support priority 0, 1, 2. See [pricing page](http://www.simpleworker.com/pricing) +for more information on priorites. + + +Schedule your Worker +-------------------- + +There are two scenarios here, one is the scenario where you want something to happen due to a user +action in your application. This is almost the same as queuing your worker. + + worker = EmailWorker.new + worker.to = current_user.email + worker.subject = "Here is your mail!" + worker.body = "This is the body" + worker.schedule(:start_at=>1.hours.since) + +Check Status +------------ + +If you still have access to the worker object, just call: + + worker.status + +If you only have the job ID, call: + + SimpleWorker.service.status(job_id) + +This will return a hash like: + + {"task_id"=>"ece460ce-12d8-11e0-8e15-12313b0440c6", + "status"=>"running", + "msg"=>nil, + "start_time"=>"2010-12-28T23:19:36+00:00", + "end_time"=>nil, + "duration"=>nil, + "progress"=>{"percent"=>25}} + + +Logging +------- + +In your worker, just call the log method with the string you want logged: + + log "Starting to do something..." + +The log will be available for viewing via the SimpleWorker UI or via log in the API: + + SimpleWorker.service.log(job_id) + +Setting Progress +---------------- + +This is just a way to let your users know where the job is at if required. + + set_progress(:percent => 25, :message => "We are a quarter of the way there!") + +You can actually put anything in this hash and it will be returned with a call to status. We recommend using +the format above for consistency and to get some additional features where we look for these values. + +Schedule a Recurring Job - CRON +------------------------------ + +The alternative is when you want to user it like Cron. In this case you'll probably +want to write a script that will schedule, you don't want to schedule it everytime your +app starts or anything so best to keep it external. + +Create a file called 'schedule_email_worker.rb' and add this: + + require 'simple_worker' + require_relative 'email_worker' + + worker = EmailWorker.new + worker.to = current_user.email + worker.subject = "Here is your mail!" + worker.body = "This is the body" + worker.schedule(:start_at=>1.hours.since, :run_every=>3600) + +Now run it and your worker will be scheduled to run every hour. + +SimpleWorker on Rails +--------------------- + +Rails 2.X: + + config.gem 'simple_worker' + +Rails 3.X: + + gem 'simple_worker' + +Now you can use your workers like they're part of your app! We recommend putting your worker classes in +/app/workers path. + +Configuring an Database Connection +--------------------------------- + +Although you could easily do this in your worker, this makes it a bit more convenient and more importantly +it will create the connection for you. If you are using Rails 3, you just need to add one line: + + config.database = Rails.configuration.database_configuration[Rails.env] + +For non Rails 3, you would add the following to your SimpleWorker config: + + config.database = { + :adapter => "mysql2", + :host => "localhost", + :database => "appdb", + :username => "appuser", + :password => "secret" + } + +Then before you job is run, SimpleWorker will establish the ActiveRecord connection. + +Including/Merging other Ruby Classes +------------------------------------ + +If you are using the Rails setup above, you can probably skip this as your models will automatically be merged. + + class AvgWorker < SimpleWorker::Base + + attr_accessor :aws_access_key, + :aws_secret_key, + :s3_suffix + + merge File.join(File.dirname(__FILE__), "..", "app", "models", "user.rb") + merge File.join(File.dirname(__FILE__), "..", "app", "models", "account") + +Or simpler yet, try using relative paths: + + merge "../models/user" + merge "../models/account.rb" + +The opposite can be done as well with "unmerge" and can be useful when using Rails to exclude classes that are automatically +merged. + + +Bringing in other Workers +--------------------- + +merge_worker +TODO + + +Configuration Options +--------------------- + +### Global Attributes + +These are attributes that can be set as part of your config block then will be set on +all your worker objects automatically. This is particularly good for things like database +connection info or things that you would need to use across the board. + +Eg: + + config.global_attributes[:db_user] = "sa" + config.global_attributes[:db_pass] = "pass" + +Then in your worker, you would have the attributes defined: + + attr_accessor :db_user, :db_pass +