diff --git a/lib/resque_unit/resque.rb b/lib/resque_unit/resque.rb index 83b3a5e..9281ce2 100644 --- a/lib/resque_unit/resque.rb +++ b/lib/resque_unit/resque.rb @@ -107,7 +107,18 @@ def size(queue_name = nil) end end - # :nodoc: + attr_writer :enqueue_front + + # :nodoc: + def enqueue_front + if defined? @enqueue_front + @enqueue_front + else + @enqueue_front = false + end + end + + # :nodoc: def enqueue(klass, *args) enqueue_to( queue_for(klass), klass, *args) end @@ -119,7 +130,7 @@ def enqueue_to( queue_name, klass, *args ) enqueue_unit(queue_name, {"class" => klass.to_s, "args" => args }) end - # :nodoc: + # :nodoc: def queue_for(klass) klass.instance_variable_get(:@queue) || (klass.respond_to?(:queue) && klass.queue) end @@ -140,7 +151,13 @@ def enqueue_unit(queue_name, hash) end return nil if before_hooks.any? { |result| result == false } end - queue(queue_name) << encode(hash) + + if enqueue_front + queues[queue_name] = [encode(hash)] + queue(queue_name) + else + queue(queue_name) << encode(hash) + end + if @hooks_enabled Plugin.after_enqueue_hooks(klass).each do |hook| klass.send(hook, *hash["args"]) @@ -161,7 +178,7 @@ def perform_with_hooks(job_payload) around_hooks = Resque::Plugin.around_hooks(job_class) after_hooks = Resque::Plugin.after_hooks(job_class) failure_hooks = Resque::Plugin.failure_hooks(job_class) - + begin # Execute before_perform hook. Abort the job gracefully if # Resque::DontPerform is raised. @@ -172,7 +189,7 @@ def perform_with_hooks(job_payload) rescue Resque::Job::DontPerform return false end - + # Execute the job. Do it in an around_perform hook if available. if around_hooks.empty? perform_without_hooks(job_payload) @@ -197,15 +214,15 @@ def perform_with_hooks(job_payload) end stack.call end - + # Execute after_perform hook after_hooks.each do |hook| job_class.send(hook, *job_payload["args"]) end - + # Return true if the job was performed return job_was_performed - + # If an exception occurs during the job execution, look for an # on_failure hook then re-raise. rescue Object => e diff --git a/test/resque_test.rb b/test/resque_test.rb index 6513f02..ded9bc7 100644 --- a/test/resque_test.rb +++ b/test/resque_test.rb @@ -42,6 +42,18 @@ it "returns all jobs' payloads when all method called" do assert Resque.all(MediumPriorityJob.queue).length == 3, "should return all 3 elements" end + + describe "enqueue_front" do + before do + Resque.enqueue_front = true + Resque.enqueue(MediumPriorityJob, "0") + Resque.enqueue_front = false + end + + it "queues the job at front" do + assert_equal [["0"], ["1"], ["2"], ["3"]], Resque.peek(MediumPriorityJob.queue, 0, 4).map{|h| h["args"]} + end + end end describe "without queued jobs" do