aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2014-05-18 16:24:30 +0200
committerDavid Heinemeier Hansson <david@loudthinking.com>2014-05-18 16:24:30 +0200
commitb32fdd5731aa0a6b8ed77305f78aba17a730b8e8 (patch)
tree9c115c41395ced6c5066c7c6e0e0a3404fd47534
parenteed52c8808fceb0004e488f77f0bc6904f7aaddf (diff)
downloadrails-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.rb10
-rw-r--r--lib/active_job/job_wrappers/resque_wrapper.rb37
-rw-r--r--lib/active_job/queue_adapters/resque_adapter.rb3
-rw-r--r--test/cases/queue_naming_test.rb17
-rw-r--r--test/jobs/hello_job.rb2
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