README.md 3.6 KB
Newer Older
1 2 3 4
# 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
5
clean-ups, to billing charges, to mailings. Anything that can be chopped up into
6 7
small units of work and run in parallel, really.

8
It also serves as the backend for Action Mailer's #deliver_later functionality
9
that makes it easy to turn any mailing into a job for running later. That's
D
Darío Hereñú 已提交
10
one of the most common jobs in a modern web application: sending emails outside
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
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
```
28
Note: To learn how to use your preferred queueing backend see its adapter
29 30
documentation at
[ActiveJob::QueueAdapters](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

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
M
Mike Boone 已提交
47
MyJob.perform_later record  # Enqueue a job to be performed as soon as the queueing system is free.
48 49 50
```

```ruby
C
Cristian Bica 已提交
51
MyJob.set(wait_until: Date.tomorrow.noon).perform_later(record)  # Enqueue a job to be performed tomorrow at noon.
52 53 54
```

```ruby
C
Cristian Bica 已提交
55
MyJob.set(wait: 1.week).perform_later(record) # Enqueue a job to be performed 1 week from now.
56 57 58 59 60 61 62
```

That's it!


## GlobalID support

A
Abdelkader Boudih 已提交
63
Active Job supports [GlobalID serialization](https://github.com/rails/globalid/) for parameters. This makes it possible
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
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
```

A
Abdelkader Boudih 已提交
86
This works with any class that mixes in GlobalID::Identification, which
87 88 89 90 91
by default has been mixed into Active Record classes.


## Supported queueing systems

92 93 94
Active Job has built-in adapters for multiple queueing backends (Sidekiq,
Resque, Delayed Job and others). To get an up-to-date list of the adapters
see the API Documentation for [ActiveJob::QueueAdapters](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).
95 96 97 98 99

## Auxiliary gems

* [activejob-stats](https://github.com/seuros/activejob-stats)

C
Cristian Bica 已提交
100
## Download and installation
101

C
Cristian Bica 已提交
102
The latest version of Active Job can be installed with RubyGems:
103

C
Cristian Bica 已提交
104
```
105
  % gem install activejob
C
Cristian Bica 已提交
106 107 108 109 110
```

Source code can be downloaded as part of the Rails project on GitHub

* https://github.com/rails/rails/tree/master/activejob
111 112 113

## License

114
Active Job is released under the MIT license:
115 116

* http://www.opensource.org/licenses/MIT
C
Cristian Bica 已提交
117 118 119 120


## Support

D
Darío Hereñú 已提交
121
API documentation is at:
C
Cristian Bica 已提交
122 123 124 125 126 127 128 129 130 131

* 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