From b6f9d5c2cf89d6d8408a88c3363075efedae54e4 Mon Sep 17 00:00:00 2001 From: Pablo Cantero Date: Sun, 13 Dec 2015 19:49:37 -0200 Subject: [PATCH] multiple-queues-per-worker Add multiple queues per worker support --- lib/shoryuken/worker.rb | 24 +++++++++++++++++------- spec/integration/launcher_spec.rb | 2 +- spec/shoryuken/worker_spec.rb | 16 ++++++++++++++-- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/shoryuken/worker.rb b/lib/shoryuken/worker.rb index 1089f16e..8cbb7abd 100644 --- a/lib/shoryuken/worker.rb +++ b/lib/shoryuken/worker.rb @@ -41,13 +41,7 @@ def server_middleware def shoryuken_options(opts = {}) @shoryuken_options = get_shoryuken_options.merge(stringify_keys(opts || {})) - queue = @shoryuken_options['queue'] - if queue.respond_to? :call - queue = queue.call - @shoryuken_options['queue'] = queue - end - - Shoryuken.register_worker(queue, self) + normalize_worker_queue! end def auto_visibility_timeout? @@ -64,6 +58,22 @@ def stringify_keys(hash) # :nodoc: end hash end + + private + + def normalize_worker_queue! + queue = @shoryuken_options['queue'] + if queue.respond_to? :call + queue = queue.call + @shoryuken_options['queue'] = queue + end + + [@shoryuken_options['queue']].flatten.compact.each(&method(:register_worker)) + end + + def register_worker(queue) + Shoryuken.register_worker(queue, self) + end end end end diff --git a/spec/integration/launcher_spec.rb b/spec/integration/launcher_spec.rb index f3d4bd6d..f5bd2a06 100644 --- a/spec/integration/launcher_spec.rb +++ b/spec/integration/launcher_spec.rb @@ -2,7 +2,7 @@ require 'shoryuken/manager' require 'shoryuken/launcher' -describe Shoryuken::Launcher do +RSpec.describe Shoryuken::Launcher do describe 'Consuming messages', slow: :true do before do Shoryuken.options[:aws][:receive_message] = { wait_time_seconds: 5 } diff --git a/spec/shoryuken/worker_spec.rb b/spec/shoryuken/worker_spec.rb index 8af9d821..d67c4588 100644 --- a/spec/shoryuken/worker_spec.rb +++ b/spec/shoryuken/worker_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe 'Shoryuken::Worker' do +RSpec.describe 'Shoryuken::Worker' do let(:sqs_queue) { double 'SQS Queue' } let(:queue) { 'default' } @@ -103,7 +103,7 @@ expect(Shoryuken.worker_registry.workers('default')).to eq([TestWorker]) end - it 'accepts a block as queue name' do + it 'accepts a block as a queue' do $queue_prefix = 'production' class NewTestWorker @@ -116,6 +116,18 @@ class NewTestWorker expect(NewTestWorker.get_shoryuken_options['queue']).to eq 'production_default' end + it 'accepts an array as a queue' do + class WorkerMultipleQueues + include Shoryuken::Worker + + shoryuken_options queue: %w[queue1 queue2 queue3] + end + + expect(Shoryuken.worker_registry.workers('queue1')).to eq([WorkerMultipleQueues]) + expect(Shoryuken.worker_registry.workers('queue2')).to eq([WorkerMultipleQueues]) + expect(Shoryuken.worker_registry.workers('queue3')).to eq([WorkerMultipleQueues]) + end + it 'is possible to configure the global defaults' do queue = SecureRandom.uuid Shoryuken.default_worker_options['queue'] = queue