diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2014-05-18 16:24:30 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2014-05-18 16:24:30 +0200 |
commit | b32fdd5731aa0a6b8ed77305f78aba17a730b8e8 (patch) | |
tree | 9c115c41395ced6c5066c7c6e0e0a3404fd47534 | |
parent | eed52c8808fceb0004e488f77f0bc6904f7aaddf (diff) | |
download | rails-b32fdd5731aa0a6b8ed77305f78aba17a730b8e8.tar.gz rails-b32fdd5731aa0a6b8ed77305f78aba17a730b8e8.tar.bz2 rails-b32fdd5731aa0a6b8ed77305f78aba17a730b8e8.zip |
Queue naming with a base, which requires a JobWrapper to comply to Resques expectation of a class variable
-rw-r--r-- | lib/active_job/base.rb | 10 | ||||
-rw-r--r-- | lib/active_job/job_wrappers/resque_wrapper.rb | 37 | ||||
-rw-r--r-- | lib/active_job/queue_adapters/resque_adapter.rb | 3 | ||||
-rw-r--r-- | test/cases/queue_naming_test.rb | 17 | ||||
-rw-r--r-- | test/jobs/hello_job.rb | 2 |
5 files changed, 64 insertions, 5 deletions
diff --git a/lib/active_job/base.rb b/lib/active_job/base.rb index e18c9d4309..341ea6158b 100644 --- a/lib/active_job/base.rb +++ b/lib/active_job/base.rb @@ -3,12 +3,18 @@ require 'active_job/queue_adapters/resque_adapter' module ActiveJob class Base - cattr_accessor(:queue_adapter) { ActiveJob::QueueAdapters::InlineAdapter } - + cattr_accessor(:queue_adapter) { ActiveJob::QueueAdapters::InlineAdapter } + cattr_accessor(:queue_base_name) { "active_jobs" } + cattr_accessor(:queue_name) { queue_base_name } + class << self def enqueue(*args) queue_adapter.queue self, *args end + + def queue_as(part_name) + self.queue_name = "#{queue_base_name}_#{part_name}" + end end end end
\ No newline at end of file diff --git a/lib/active_job/job_wrappers/resque_wrapper.rb b/lib/active_job/job_wrappers/resque_wrapper.rb new file mode 100644 index 0000000000..c34ea99f3c --- /dev/null +++ b/lib/active_job/job_wrappers/resque_wrapper.rb @@ -0,0 +1,37 @@ +require 'resque' + +require 'active_support/core_ext/enumerable' +require 'active_support/core_ext/array/access' +require 'active_support/core_ext/string/inflections' + + +module ActiveJob + module JobWrappers + class ResqueWrapper + class << self + def wrap(job, args) + [ new(job), *args.prepend(job) ] + end + + def perform(*args) + unwrapped_job = args.first.constantize + + if args.many? + unwrapped_job.perform *args.from(1) + else + unwrapped_job.perform + end + end + end + + + def initialize(job) + @queue = job.queue_name + end + + def to_s + self.class.to_s + end + end + end +end
\ No newline at end of file diff --git a/lib/active_job/queue_adapters/resque_adapter.rb b/lib/active_job/queue_adapters/resque_adapter.rb index 4155cd5bf9..43a44d2a48 100644 --- a/lib/active_job/queue_adapters/resque_adapter.rb +++ b/lib/active_job/queue_adapters/resque_adapter.rb @@ -1,11 +1,12 @@ require 'resque' +require 'active_job/job_wrappers/resque_wrapper' module ActiveJob module QueueAdapters class ResqueAdapter class << self def queue(job, *args) - Resque.enqueue(job, *args) + Resque.enqueue *JobWrappers::ResqueWrapper.wrap(job, args) end end end diff --git a/test/cases/queue_naming_test.rb b/test/cases/queue_naming_test.rb new file mode 100644 index 0000000000..e171474686 --- /dev/null +++ b/test/cases/queue_naming_test.rb @@ -0,0 +1,17 @@ +require 'helper' +require 'jobs/hello_job' + +class QueueNamingTest < ActiveSupport::TestCase + test 'name derived from base' do + assert_equal "active_jobs", HelloJob.queue_name + end + + test 'name appended in job' do + begin + HelloJob.queue_as :greetings + assert_equal "active_jobs_greetings", HelloJob.queue_name + ensure + HelloJob.queue_name = HelloJob.queue_base_name + end + end +end diff --git a/test/jobs/hello_job.rb b/test/jobs/hello_job.rb index 469123fe0a..d0e65f9674 100644 --- a/test/jobs/hello_job.rb +++ b/test/jobs/hello_job.rb @@ -1,6 +1,4 @@ class HelloJob < ActiveJob::Base - @queue = :greetings - def self.perform(greeter = "David") $BUFFER << "#{greeter} says hello" end |