mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
merge master
This commit is contained in:
commit
b49d3f105f
17 changed files with 161 additions and 44 deletions
2
Gemfile
2
Gemfile
|
@ -9,3 +9,5 @@ gem 'sidekiq'
|
|||
gem 'sucker_punch'
|
||||
gem 'delayed_job'
|
||||
gem 'queue_classic'
|
||||
gem 'sneakers', '0.1.1.pre'
|
||||
gem 'que'
|
||||
|
|
16
Gemfile.lock
16
Gemfile.lock
|
@ -20,7 +20,10 @@ GEM
|
|||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.1)
|
||||
tzinfo (~> 1.1)
|
||||
amq-protocol (1.9.2)
|
||||
builder (3.2.2)
|
||||
bunny (1.1.9)
|
||||
amq-protocol (>= 1.9.2)
|
||||
celluloid (0.15.2)
|
||||
timers (~> 1.1.0)
|
||||
connection_pool (2.0.0)
|
||||
|
@ -32,6 +35,7 @@ GEM
|
|||
mono_logger (1.1.0)
|
||||
multi_json (1.9.3)
|
||||
pg (0.17.1)
|
||||
que (0.7.3)
|
||||
queue_classic (2.2.3)
|
||||
pg (~> 0.17.0)
|
||||
rack (1.5.2)
|
||||
|
@ -53,18 +57,28 @@ GEM
|
|||
rufus-scheduler (~> 2.0)
|
||||
rufus-scheduler (2.0.24)
|
||||
tzinfo (>= 0.3.22)
|
||||
serverengine (1.5.7)
|
||||
sigdump (~> 0.2.2)
|
||||
sidekiq (3.0.2)
|
||||
celluloid (>= 0.15.2)
|
||||
connection_pool (>= 2.0.0)
|
||||
json
|
||||
redis (>= 3.0.6)
|
||||
redis-namespace (>= 1.3.1)
|
||||
sigdump (0.2.2)
|
||||
sinatra (1.4.4)
|
||||
rack (~> 1.4)
|
||||
rack-protection (~> 1.4)
|
||||
tilt (~> 1.3, >= 1.3.4)
|
||||
sneakers (0.1.1.pre)
|
||||
bunny (~> 1.1.3)
|
||||
serverengine
|
||||
thor
|
||||
thread
|
||||
sucker_punch (1.0.5)
|
||||
celluloid (~> 0.15.2)
|
||||
thor (0.19.1)
|
||||
thread (0.1.4)
|
||||
thread_safe (0.3.3)
|
||||
tilt (1.4.1)
|
||||
timers (1.1.0)
|
||||
|
@ -79,9 +93,11 @@ PLATFORMS
|
|||
DEPENDENCIES
|
||||
activejob!
|
||||
delayed_job
|
||||
que
|
||||
queue_classic
|
||||
rake
|
||||
resque
|
||||
resque-scheduler
|
||||
sidekiq
|
||||
sneakers (= 0.1.1.pre)
|
||||
sucker_punch
|
||||
|
|
19
README.md
19
README.md
|
@ -24,13 +24,16 @@ Set the queue adapter for Active Job:
|
|||
|
||||
``` ruby
|
||||
ActiveJob::Base.queue_adapter = :inline # default queue adapter
|
||||
# Adapters currently supported: :resque, :sidekiq, :sucker_punch, :delayed_job
|
||||
# Adapters currently supported: :delayed_job, :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
|
||||
|
@ -79,15 +82,17 @@ by default has been mixed into Active Record classes.
|
|||
|
||||
We currently have adapters for:
|
||||
|
||||
* Resque 1.x
|
||||
* Sidekiq
|
||||
* Sucker Punch
|
||||
* Delayed Job
|
||||
* QueueClassic
|
||||
* [Delayed Job](https://github.com/collectiveidea/delayed_job)
|
||||
* [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)
|
||||
|
||||
We would like to have adapters for:
|
||||
|
||||
* Sneakers
|
||||
* [Resque 2.x](https://github.com/resque/resque) (see [#7](https://github.com/rails/activejob/issues/7))
|
||||
|
||||
|
||||
## Under development as a gem, targeted for Rails inclusion
|
||||
|
|
4
Rakefile
4
Rakefile
|
@ -20,11 +20,11 @@ task :default => :test
|
|||
|
||||
desc 'Run all adapter tests'
|
||||
task :test do
|
||||
tasks = %w(test_inline test_resque test_sidekiq test_sucker_punch test_delayed_job test_queue_classic)
|
||||
tasks = %w(test_inline test_delayed_job test_que test_queue_classic test_resque test_sidekiq test_sneakers test_sucker_punch)
|
||||
run_without_aborting(*tasks)
|
||||
end
|
||||
|
||||
%w(inline resque sidekiq sucker_punch delayed_job queue_classic).each do |adapter|
|
||||
%w(inline delayed_job que queue_classic resque sidekiq sneakers sucker_punch).each do |adapter|
|
||||
Rake::TestTask.new("test_#{adapter}") do |t|
|
||||
t.libs << 'test'
|
||||
t.test_files = FileList['test/cases/**/*_test.rb']
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
require 'active_job/queue_adapter'
|
||||
require 'active_job/queue_name'
|
||||
require 'active_job/enqueuing'
|
||||
require 'active_job/logging'
|
||||
|
||||
module ActiveJob
|
||||
class Base
|
||||
extend QueueAdapter
|
||||
extend QueueName
|
||||
extend Enqueuing
|
||||
extend Logging
|
||||
end
|
||||
end
|
|
@ -11,6 +11,7 @@ module ActiveJob
|
|||
# The return value is adapter-specific and may change in a future
|
||||
# ActiveJob release.
|
||||
def enqueue(*args)
|
||||
ActiveSupport::Notifications.instrument "enqueue.active_job", adapter: queue_adapter, job: self, params: args
|
||||
queue_adapter.queue self, *Parameters.serialize(args)
|
||||
end
|
||||
|
||||
|
|
18
lib/active_job/log_subscriber.rb
Normal file
18
lib/active_job/log_subscriber.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
module ActiveJob
|
||||
class LogSubscriber < ActiveSupport::LogSubscriber
|
||||
def enqueue(event)
|
||||
payload = event.payload
|
||||
params = payload[:params]
|
||||
adapter = payload[:adapter]
|
||||
job = payload[:job]
|
||||
|
||||
info "ActiveJob enqueued to #{adapter.name.demodulize} job #{job.name}: #{params.inspect}"
|
||||
end
|
||||
|
||||
def logger
|
||||
ActiveJob::Base.logger
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ActiveJob::LogSubscriber.attach_to :active_job
|
7
lib/active_job/logging.rb
Normal file
7
lib/active_job/logging.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require 'active_job/log_subscriber'
|
||||
|
||||
module ActiveJob
|
||||
module Logging
|
||||
mattr_accessor(:logger) { ActiveSupport::Logger.new(STDOUT) }
|
||||
end
|
||||
end
|
|
@ -6,14 +6,13 @@ module ActiveJob
|
|||
mattr_reader(:queue_adapter) { ActiveJob::QueueAdapters::InlineAdapter }
|
||||
|
||||
def queue_adapter=(name_or_adapter)
|
||||
case name_or_adapter
|
||||
when Symbol, String
|
||||
adapter = load_adapter(name_or_adapter)
|
||||
else
|
||||
adapter = name_or_adapter
|
||||
end
|
||||
|
||||
@@queue_adapter = adapter
|
||||
@@queue_adapter = \
|
||||
case name_or_adapter
|
||||
when Symbol, String
|
||||
load_adapter(name_or_adapter)
|
||||
when Class
|
||||
name_or_adapter
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
19
lib/active_job/queue_adapters/que_adapter.rb
Normal file
19
lib/active_job/queue_adapters/que_adapter.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
require 'que'
|
||||
|
||||
module ActiveJob
|
||||
module QueueAdapters
|
||||
class QueAdapter
|
||||
class << self
|
||||
def queue(job, *args)
|
||||
JobWrapper.enqueue job, *args, queue: job.queue_name
|
||||
end
|
||||
end
|
||||
|
||||
class JobWrapper < Que::Job
|
||||
def run(job, *args)
|
||||
job.new.perform *Parameters.deserialize(args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -5,8 +5,7 @@ module ActiveJob
|
|||
class QueueClassicAdapter
|
||||
class << self
|
||||
def queue(job, *args)
|
||||
qc_queue = QC::Queue.new(job.queue_name)
|
||||
qc_queue.enqueue("ActiveJob::QueueAdapters::QueueClassicAdapter::JobWrapper.perform", job, *args)
|
||||
QC::Queue.new(job.queue_name).enqueue("#{JobWrapper.name}.perform", job, *args)
|
||||
end
|
||||
|
||||
def queue_at(job, timestamp, *args)
|
||||
|
|
23
lib/active_job/queue_adapters/sneakers_adapter.rb
Normal file
23
lib/active_job/queue_adapters/sneakers_adapter.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
require 'sneakers'
|
||||
|
||||
module ActiveJob
|
||||
module QueueAdapters
|
||||
class SneakersAdapter
|
||||
class << self
|
||||
def queue(job, *args)
|
||||
JobWrapper.enqueue([job, *args])
|
||||
end
|
||||
end
|
||||
|
||||
class JobWrapper
|
||||
include Sneakers::Worker
|
||||
|
||||
self.from_queue("queue", {})
|
||||
|
||||
def work(job, *args)
|
||||
job.new.perform *Parameters.deserialize(args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -22,8 +22,8 @@ module ActiveJob
|
|||
class JobWrapper
|
||||
include SuckerPunch::Job
|
||||
|
||||
def perform(job_name, *args)
|
||||
job_name.new.perform *Parameters.deserialize(args)
|
||||
def perform(job, *args)
|
||||
job.new.perform *Parameters.deserialize(args)
|
||||
end
|
||||
|
||||
def later(sec, job_name, *args)
|
||||
|
|
2
test/adapters/que.rb
Normal file
2
test/adapters/que.rb
Normal file
|
@ -0,0 +1,2 @@
|
|||
ActiveJob::Base.queue_adapter = :que
|
||||
Que.mode = :sync
|
2
test/adapters/sneakers.rb
Normal file
2
test/adapters/sneakers.rb
Normal file
|
@ -0,0 +1,2 @@
|
|||
require 'support/sneakers/inline'
|
||||
ActiveJob::Base.queue_adapter = :sneakers
|
|
@ -1,36 +1,46 @@
|
|||
require 'helper'
|
||||
|
||||
class AdapterTest < ActiveSupport::TestCase
|
||||
def setup
|
||||
@old_adapter = ActiveJob::Base.queue_adapter
|
||||
end
|
||||
setup { @old_adapter = ActiveJob::Base.queue_adapter }
|
||||
teardown { ActiveJob::Base.queue_adapter = @old_adapter }
|
||||
|
||||
test 'should load inline adapter' do
|
||||
ActiveJob::Base.queue_adapter = :inline
|
||||
assert_equal ActiveJob::QueueAdapters::InlineAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load resque adapter' do
|
||||
ActiveJob::Base.queue_adapter = :resque
|
||||
assert_equal ActiveJob::QueueAdapters::ResqueAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load sidekiq adapter' do
|
||||
ActiveJob::Base.queue_adapter = :sidekiq
|
||||
assert_equal ActiveJob::QueueAdapters::SidekiqAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load sucker punch adapter' do
|
||||
ActiveJob::Base.queue_adapter = :sucker_punch
|
||||
assert_equal ActiveJob::QueueAdapters::SuckerPunchAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load delayed_job adapter' do
|
||||
test 'should load Delayed Job adapter' do
|
||||
ActiveJob::Base.queue_adapter = :delayed_job
|
||||
assert_equal ActiveJob::QueueAdapters::DelayedJobAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
def teardown
|
||||
ActiveJob::Base.queue_adapter = @old_adapter
|
||||
test 'should load Que adapter' do
|
||||
ActiveJob::Base.queue_adapter = :que
|
||||
assert_equal ActiveJob::QueueAdapters::QueAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load Queue Classic adapter' do
|
||||
ActiveJob::Base.queue_adapter = :queue_classic
|
||||
assert_equal ActiveJob::QueueAdapters::QueueClassicAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load Resque adapter' do
|
||||
ActiveJob::Base.queue_adapter = :resque
|
||||
assert_equal ActiveJob::QueueAdapters::ResqueAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load Sidekiq adapter' do
|
||||
ActiveJob::Base.queue_adapter = :sidekiq
|
||||
assert_equal ActiveJob::QueueAdapters::SidekiqAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load Sucker Punch adapter' do
|
||||
ActiveJob::Base.queue_adapter = :sucker_punch
|
||||
assert_equal ActiveJob::QueueAdapters::SuckerPunchAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
|
||||
test 'should load Sneakers adapter' do
|
||||
ActiveJob::Base.queue_adapter = :sneakers
|
||||
assert_equal ActiveJob::QueueAdapters::SneakersAdapter, ActiveJob::Base.queue_adapter
|
||||
end
|
||||
end
|
||||
|
|
12
test/support/sneakers/inline.rb
Normal file
12
test/support/sneakers/inline.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require 'sneakers'
|
||||
|
||||
module Sneakers
|
||||
module Worker
|
||||
module ClassMethods
|
||||
def enqueue(msg)
|
||||
worker = self.new(nil, nil, {})
|
||||
worker.work(*msg)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue