Skip to content

Instantly share code, notes, and snippets.

@iconara
Created May 12, 2011 09:44
Show Gist options
  • Save iconara/968259 to your computer and use it in GitHub Desktop.
Save iconara/968259 to your computer and use it in GitHub Desktop.
AMQP monkey patch
# This monkey patches tmm1's amqp gem to handle Basic Return
module AMQP
class ConsumerHijacker
attr_reader :header, :body
def receive(header, body)
@header, @body = header, body
end
def reset!
receive(nil, nil)
end
end
class Channel
alias_method :old_process_frame, :process_frame
def process_frame(frame)
if frame.is_a?(Frame::Body) && @method.is_a?(Protocol::Basic::Return)
@consumer_hijacker ||= ConsumerHijacker.new
@consumer_hijacker.reset!
actual_consumer = @consumer
@consumer = @consumer_hijacker
old_process_frame(frame)
@consumer = actual_consumer
if @consumer_hijacker.header && @consumer_hijacker.body
header, body = @consumer_hijacker.header, @consumer_hijacker.body
@consumer.receive(header, body) if @consumer
@return_callback.call(Header.new(self, header), body) if @return_callback
end
else
old_process_frame(frame)
end
end
def on_return(&callback)
@return_callback = callback
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment