Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 25 additions & 8 deletions lib/resque_unit/resque.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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"])
Expand All @@ -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.
Expand All @@ -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)
Expand All @@ -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
Expand Down
12 changes: 12 additions & 0 deletions test/resque_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down