2014-08-12 05:17:19 -04:00
|
|
|
# Active Job -- Make work happen later
|
|
|
|
|
|
|
|
Active Job is a framework for declaring jobs and making them run on a variety
|
|
|
|
of queueing backends. These jobs can be everything from regularly scheduled
|
2014-08-20 15:36:58 -04:00
|
|
|
clean-ups, to billing charges, to mailings. Anything that can be chopped up into
|
2014-08-12 05:17:19 -04:00
|
|
|
small units of work and run in parallel, really.
|
|
|
|
|
2014-08-12 08:43:43 -04:00
|
|
|
It also serves as the backend for ActionMailer's #deliver_later functionality
|
2014-08-12 05:17:19 -04:00
|
|
|
that makes it easy to turn any mailing into a job for running later. That's
|
|
|
|
one of the most common jobs in a modern web application: Sending emails outside
|
|
|
|
of the request-response cycle, so the user doesn't have to wait on it.
|
|
|
|
|
|
|
|
The main point is to ensure that all Rails apps will have a job infrastructure
|
|
|
|
in place, even if it's in the form of an "immediate runner". We can then have
|
|
|
|
framework features and other gems build on top of that, without having to worry
|
|
|
|
about API differences between Delayed Job and Resque. Picking your queuing
|
|
|
|
backend becomes more of an operational concern, then. And you'll be able to
|
|
|
|
switch between them without having to rewrite your jobs.
|
|
|
|
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
Set the queue adapter for Active Job:
|
|
|
|
|
|
|
|
``` ruby
|
|
|
|
ActiveJob::Base.queue_adapter = :inline # default queue adapter
|
|
|
|
# Adapters currently supported: :backburner, :delayed_job, :qu, :que, :queue_classic,
|
|
|
|
# :resque, :sidekiq, :sneakers, :sucker_punch
|
|
|
|
```
|
|
|
|
|
|
|
|
Declare a job like so:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
class MyJob < ActiveJob::Base
|
|
|
|
queue_as :my_jobs
|
|
|
|
|
|
|
|
def perform(record)
|
|
|
|
record.do_work
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Enqueue a job like so:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
MyJob.enqueue record # Enqueue a job to be performed as soon the queueing system is free.
|
|
|
|
```
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
MyJob.enqueue_at Date.tomorrow.noon, record # Enqueue a job to be performed tomorrow at noon.
|
|
|
|
```
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
MyJob.enqueue_in 1.week, record # Enqueue a job to be performed 1 week from now.
|
|
|
|
```
|
|
|
|
|
|
|
|
That's it!
|
|
|
|
|
|
|
|
|
|
|
|
## GlobalID support
|
|
|
|
|
2014-08-16 21:06:30 -04:00
|
|
|
Active Job supports [GlobalID serialization](https://github.com/rails/globalid/) for parameters. This makes it possible
|
2014-08-12 05:17:19 -04:00
|
|
|
to pass live Active Record objects to your job instead of class/id pairs, which
|
|
|
|
you then have to manually deserialize. Before, jobs would look like this:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
class TrashableCleanupJob
|
|
|
|
def perform(trashable_class, trashable_id, depth)
|
|
|
|
trashable = trashable_class.constantize.find(trashable_id)
|
|
|
|
trashable.cleanup(depth)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Now you can simply do:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
class TrashableCleanupJob
|
|
|
|
def perform(trashable, depth)
|
|
|
|
trashable.cleanup(depth)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2014-08-16 21:06:30 -04:00
|
|
|
This works with any class that mixes in GlobalID::Identification, which
|
2014-08-12 05:17:19 -04:00
|
|
|
by default has been mixed into Active Record classes.
|
|
|
|
|
|
|
|
|
|
|
|
## Supported queueing systems
|
|
|
|
|
|
|
|
We currently have adapters for:
|
|
|
|
|
|
|
|
* [Backburner](https://github.com/nesquena/backburner)
|
|
|
|
* [Delayed Job](https://github.com/collectiveidea/delayed_job)
|
|
|
|
* [Qu](https://github.com/bkeepers/qu)
|
|
|
|
* [Que](https://github.com/chanks/que)
|
|
|
|
* [QueueClassic](https://github.com/ryandotsmith/queue_classic)
|
|
|
|
* [Resque 1.x](https://github.com/resque/resque)
|
|
|
|
* [Sidekiq](https://github.com/mperham/sidekiq)
|
|
|
|
* [Sneakers](https://github.com/jondot/sneakers)
|
|
|
|
* [Sucker Punch](https://github.com/brandonhilkert/sucker_punch)
|
|
|
|
|
|
|
|
|
|
|
|
## Auxiliary gems
|
|
|
|
|
|
|
|
* [activejob-stats](https://github.com/seuros/activejob-stats)
|
|
|
|
|
2014-08-12 08:43:43 -04:00
|
|
|
## Download and installation
|
2014-08-12 05:17:19 -04:00
|
|
|
|
2014-08-12 08:43:43 -04:00
|
|
|
The latest version of Active Job can be installed with RubyGems:
|
2014-08-12 05:17:19 -04:00
|
|
|
|
2014-08-12 08:43:43 -04:00
|
|
|
```
|
|
|
|
% [sudo] gem install activejob
|
|
|
|
```
|
|
|
|
|
|
|
|
Source code can be downloaded as part of the Rails project on GitHub
|
|
|
|
|
|
|
|
* https://github.com/rails/rails/tree/master/activejob
|
2014-08-12 05:17:19 -04:00
|
|
|
|
|
|
|
## License
|
|
|
|
|
2014-08-12 08:43:43 -04:00
|
|
|
ActiveJob is released under the MIT license:
|
2014-08-12 05:17:19 -04:00
|
|
|
|
|
|
|
* http://www.opensource.org/licenses/MIT
|
2014-08-12 08:43:43 -04:00
|
|
|
|
|
|
|
|
|
|
|
## Support
|
|
|
|
|
|
|
|
API documentation is at
|
|
|
|
|
|
|
|
* http://api.rubyonrails.org
|
|
|
|
|
|
|
|
Bug reports can be filed for the Ruby on Rails project here:
|
|
|
|
|
|
|
|
* https://github.com/rails/rails/issues
|
|
|
|
|
|
|
|
Feature requests should be discussed on the rails-core mailing list here:
|
|
|
|
|
|
|
|
* https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
|
|
|
|
|
|
|
|
|