A Rails 4 compatible queue with support for executing jobs in the future and serialization with ActiveRecord.
Ruby CSS CoffeeScript
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
config
docs
lib
spec
.gitignore
.rspec
.travis.yml
Gemfile
Guardfile
LICENSE.txt
README.md
Rakefile
afterparty.gemspec
dump.rdb

README.md

Afterparty

Build Status Code Climate Coverage Status

A Rails 3 & 4 compatible queue with support for executing jobs in the future and persistence with ActiveRecord.

Installation

Add this line to your application's Gemfile:

gem 'afterparty'

And then execute:

$ bundle
$ rails g afterparty
$ rake db:migrate

This will create an initializer in config/initializers/afterparty.rb. It initializes a queue at Rails.configuration.queue for you to pass jobs to.

Usage

A job is a ruby object with a run method.

class Job
  def run
    puts "Hello!"
  end
end

Then add it to the queue at any time.

Rails.configuration.queue << Job.new

If your job responds to an execute_at method, the queue will wait to process that job until the specified time.

Running jobs

You can start a worker in a separate process for executing jobs by calling rake jobs:work.

Helper jobs

Afterparty provides helper job wrappers for executing arbitrary methods or mailers.

# pass an object, method, and arguments 

mailer_job = Afterparty::MailerJob.new UserMailer, :welcome, @user
mailer_job.execute_at = Time.now + 20.minutes
Rails.configuration.queue << mailer_job

job = Afterparty::BasicJob.new @user, :reset_password
Rails.configuration.queue << job

Dashboard

dashboard screenshot

This gem provides a handy dashboard for inspecting, debugging, and re-running jobs.

Visit http://localhost:3000/afterparty/ and login with admin and password. You can change the authentication strategy in config/initializers/afterparty.rb to something like this:

Rails.configuration.queue.config_login do |username, password|
  user = User.authenticate(username, password)
  !user.nil? && user.is_admin?
end

Unicorn configuration

If you're using Unicorn as your application server, you can run a worker thread asynchronously by adding a few lines to your unicorn.rb:

@jobs_pid = nil

before_fork do |server, worker|
  @jobs_pid ||= spawn("bundle exec rake jobs:work")

  # ... the rest of your configuration

This has the advantage of, for example, staying within Heroku's free tier by not running a worker dyno.

TODO

  • Finish namespacing support by adding documentation and allowing a worker rake task to pull jobs from a custom (or all) queues.

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Add a test in spec/redis_queue_spec.rb
  4. Make sure tests pass when you run rake
  5. Commit your changes (git commit -am 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new Pull Request