lib/daemon_kit/ruote_pseudo_participant.rb
module DaemonKit
# Common convenience methods for making ruote pseudo-participants more DRY
# and unified
class RuotePseudoParticipant
class << self
attr_reader :exception_handler_method, :exception_handler_block,
:on_complete_handler_method, :on_complete_handler_block
# Register a callback method or block that gets called when an exception
# occurs during the processing of an action. +handler+ can be a symbol or
# string with a method name, or a block. Both will get the exception as
# the first parameter, and the block handler will receive the participant
# instance as the second parameter
def on_exception( handler = nil, &block )
@exception_handler_method = handler
@exception_handler_block = block
end
# Register a callback method or block that gets called when the action
# was successfully completed. Block callbacks get the workitem as
# parameter.
def on_complete( handler = nil, &block )
@on_complete_handler_method = handler
@on_complete_handler_block = block
end
end
# Current workitem
attr_reader :workitem
# Current action
attr_reader :action
# Perform the specified action with the provided workitem
def perform( action, workitem )
@action, @workitem = action, workitem
begin
send( action )
run_callbacks
rescue => e
handle_exception( e )
end
end
def handle_exception( e )
raise e if self.class.exception_handler_method.nil? && self.class.exception_handler_block.nil?
if self.class.exception_handler_method
send( self.class.exception_handler_method, e )
else
self.class.exception_handler_block.call( e, self )
end
end
def run_callbacks
return if self.class.on_complete_handler_block.nil? && self.class.on_complete_handler_method.nil?
if self.class.on_complete_handler_method
send( self.class.on_complete_handler_method )
else
self.class.on_complete_handler_block.call( workitem )
end
end
end
end