diff --git a/lib/resque/integration/unique.rb b/lib/resque/integration/unique.rb index 9941e4e..dc534f9 100644 --- a/lib/resque/integration/unique.rb +++ b/lib/resque/integration/unique.rb @@ -45,7 +45,7 @@ def unique? # Метод вызывает resque-scheduler чтобы поставить задание в текущую очередь def scheduled(queue, klass, *args) - klass.constantize.enqueue(*args) + klass.constantize.enqueue_to(queue, *args) end # Метод вызывает resque-retry когда ставить отложенное задание @@ -167,6 +167,17 @@ def enqueue_with_check(*args) #:nodoc: enqueue_without_check(*args) end + def enqueue_to(queue, *args) + meta = enqueued?(*args) + return meta if meta.present? + + meta = ::Resque::Plugins::Meta::Metadata.new('meta_id' => meta_id(args), 'job_class' => to_s) + meta.save + + Resque.enqueue_to(queue, self, meta.meta_id, *args) + meta + end + private # Remove lock for job with given +args+ def unlock(*args) diff --git a/spec/resque/integration/unique_spec.rb b/spec/resque/integration/unique_spec.rb index da0c626..9496a8e 100644 --- a/spec/resque/integration/unique_spec.rb +++ b/spec/resque/integration/unique_spec.rb @@ -57,6 +57,22 @@ class JobEnqueueTest JobEnqueueTest.should be_enqueued(1) end + it 'returns new meta when job is enqueued to specific queue' do + meta = JobEnqueueTest.enqueue_to(:fast, 1) + meta.should be_a Resque::Plugins::Meta::Metadata + + expect(JobEnqueueTest.enqueued?(1)).to_not be_nil + expect(Resque.size(:fast)).to eq 1 + end + + it 'returns new meta when job is scheduled' do + meta = JobEnqueueTest.scheduled(:fast, 'JobEnqueueTest', 1) + meta.should be_a Resque::Plugins::Meta::Metadata + + expect(JobEnqueueTest.enqueued?(1)).to_not be_nil + expect(Resque.size(:fast)).to eq 1 + end + it 'returns the same meta if job already in queue' do meta1 = JobEnqueueTest.enqueue(2) meta2 = JobEnqueueTest.enqueue(2) @@ -110,4 +126,4 @@ def self.execute(x) worker.join end -end \ No newline at end of file +end