Skip to content

Instantly share code, notes, and snippets.

@ssimeonov
Created December 21, 2011 16:05
Show Gist options
  • Save ssimeonov/1506548 to your computer and use it in GitHub Desktop.
Save ssimeonov/1506548 to your computer and use it in GitHub Desktop.
Dynamic Resque job handlers
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
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