class Nestene::Actor::Core
Public Class Methods
new(storage)
click to toggle source
# File lib/nestene/actor/core.rb, line 10 def initialize(storage) subscribe('state_update', :notify_waiters) @execution_futures={} @storage = storage end
Public Instance Methods
auton_names()
click to toggle source
# File lib/nestene/actor/core.rb, line 16 def auton_names @storage.list end
cancel_delayed_step(auton_id, step_id)
click to toggle source
# File lib/nestene/actor/core.rb, line 60 def cancel_delayed_step auton_id, step_id Celluloid::Actor["storage:%s" % auton_id].update do |state| delayed = state.queue.remove_delayed_method step_id end end
create_auton(type, auton_id=SecureRandom.uuid)
click to toggle source
# File lib/nestene/actor/core.rb, line 28 def create_auton type, auton_id=SecureRandom.uuid storage = AutonStorage.new(auton_id, @storage) Celluloid::Actor["storage:%s" % auton_id] = storage storage.create(type) auton_id rescue Exception => e abort e end
get_credentials()
click to toggle source
# File lib/nestene/actor/core.rb, line 20 def get_credentials @storage.load('__credentials__') || {} end
get_state(auton_id)
click to toggle source
# File lib/nestene/actor/core.rb, line 37 def get_state auton_id Celluloid::Actor["storage:%s" % auton_id].get rescue Exception => e abort e end
notify_waiters(topic, auton_id, state)
click to toggle source
# File lib/nestene/actor/core.rb, line 140 def notify_waiters topic, auton_id, state if state future = @execution_futures.delete(auton_id) future.signal(SelfValue.new) if future end end
repeat_step(auton_id, method_uuid)
click to toggle source
# File lib/nestene/actor/core.rb, line 81 def repeat_step auton_id, method_uuid step_id = SecureRandom.uuid Celluloid::Actor["storage:%s" % auton_id].update do |state| original_step = state.queue.executed.find{|m| m.uuid == method_uuid} method = ScheduledMethod.new method.name = original_step.name method.parameters = original_step.parameters method.uuid = step_id state.queue.to_execute.unshift method state.queue.failed = false end step_id end
resume(auton_id)
click to toggle source
# File lib/nestene/actor/core.rb, line 97 def resume auton_id Celluloid::Actor["storage:%s" % auton_id].update do |state| state.queue.failed = false end end
schedule_delayed_step(auton_id, delay , name, parameters=[])
click to toggle source
# File lib/nestene/actor/core.rb, line 66 def schedule_delayed_step auton_id, delay , name, parameters=[] Celluloid::Actor["storage:%s" % auton_id].update do |state| delayed = state.queue.add_delayed_method name, parameters, delay delayed.uuid end end
schedule_repeating_delayed_step(auton_id, every, delay, name, parameters=[])
click to toggle source
# File lib/nestene/actor/core.rb, line 74 def schedule_repeating_delayed_step auton_id, every, delay, name, parameters=[] Celluloid::Actor["storage:%s" % auton_id].update do |state| delayed = state.queue.add_delayed_method name, parameters, delay, every delayed.uuid end end
schedule_step(auton_id, step_name, parameters=[], callback_auton_id=nil, callback_method=nil)
click to toggle source
# File lib/nestene/actor/core.rb, line 43 def schedule_step auton_id, step_name, parameters=[], callback_auton_id=nil, callback_method=nil step_id = SecureRandom.uuid Celluloid::Actor["storage:%s" % auton_id].update do |state| method = ScheduledMethod.new method.name = step_name method.parameters = parameters method.uuid = step_id if callback_auton_id && callback_method method.callback = Callback.new method.callback.name = callback_method method.callback.auton_id = callback_auton_id end state.queue.to_execute << method end step_id end
set_credentials(credentials)
click to toggle source
# File lib/nestene/actor/core.rb, line 24 def set_credentials credentials @storage.store('__credentials__',credentials) end
wait_for_execution_result(auton_id, method_uuid)
click to toggle source
# File lib/nestene/actor/core.rb, line 104 def wait_for_execution_result auton_id, method_uuid future = nil executed = nil exclusive do state = Celluloid::Actor["storage:%s" % auton_id].get unless @execution_futures.has_key?(auton_id) @execution_futures[auton_id] = Celluloid::Future.new end future = @execution_futures[auton_id] executed = state ? state.queue.executed.find{|m| m.uuid == method_uuid} : nil end until executed executed = future.value state = Celluloid::Actor["storage:%s" % auton_id].get executed = state.queue.executed.find{|m| m.uuid == method_uuid} end if executed.error abort executed.error else return executed.result end end