Created
December 21, 2011 16:05
-
-
Save ssimeonov/1506548 to your computer and use it in GitHub Desktop.
Dynamic Resque job handlers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "spx_utils/resque" | |
describe SpxUtils::Resque do | |
describe ".job_handler" do | |
subject do | |
SpxUtils::Resque.job_handler(:my_queue) do |x, y| | |
x + y | |
end | |
end | |
specify { subject.class.name.to_s == "My_queue" } | |
describe "<generated>.queue" do | |
it { should respond_to(:queue) } | |
its(:queue) { should == :my_queue } | |
end | |
describe "<generated>.perform" do | |
specify { subject.perform(1, 2).should == 3 } | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Object | |
def metaclass | |
class << self | |
self | |
end | |
end | |
end | |
module SpxUtils | |
class Resque | |
=begin | |
Generates a dynamic Resque job handler class with a block. | |
Allows for ridiculously simple definition of job handlers. | |
klass = SpxUtils::Rescue.job_handler :my_queue do |*args| | |
p args | |
end | |
klass.queue | |
klass.perform 1, 2, 3 | |
Resque.enqueue klass, 4, 5, 6 | |
=end | |
def self.job_handler(queue_name, &block) | |
job_handler_class queue_name, &block | |
end | |
private | |
def self.job_handler_class(queue_name, &block) | |
class_name = queue_name.capitalize | |
klass = Object.const_set(class_name, Class.new) | |
klass.class_eval do | |
def self.create_method(name, &block) | |
metaclass.instance_eval do | |
define_method(name) do |*args| | |
begin | |
block.call(*args) | |
rescue Exception => e | |
puts "\n\nException: #{e.inspect}" | |
puts "\nBacktrace: #{e.backtrace}" | |
end | |
end | |
end | |
end | |
create_method :queue do | |
queue_name | |
end | |
create_method :perform, &block | |
end | |
klass | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment