class Concurrent::Actor::Behaviour::Pausing

Allows to pause actors on errors. When paused all arriving messages are collected and processed after the actor is resumed or reset. Resume will simply continue with next message. Reset also reinitialized context. @note TODO missing example

Public Class Methods

new(core, subsequent, core_options) click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 11
def initialize(core, subsequent, core_options)
  super core, subsequent, core_options
  @paused   = false
  @deferred = []
end

Public Instance Methods

on_envelope(envelope) click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 21
def on_envelope(envelope)
  case envelope.message
  when :pause!
    pause!
  when :paused?
    paused?
  when :resume!
    resume!
  when :reset!
    reset!
  when :restart!
    restart!
  else
    if paused?
      @deferred << envelope
      MESSAGE_PROCESSED
    else
      pass envelope
    end
  end
end
on_event(public, event) click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 72
def on_event(public, event)
  event_name, _ = event
  reject_deferred if event_name == :terminated
  super public, event
end
pause!(error = nil) click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 43
def pause!(error = nil)
  do_pause
  broadcast true, error || :paused
  true
end
paused?() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 17
def paused?
  @paused
end
reset!() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 56
def reset!
  return false unless paused?
  broadcast(false, :resetting)
  do_reset
  broadcast(true, :reset)
  true
end
restart!() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 64
def restart!
  return false unless paused?
  broadcast(false, :restarting)
  do_restart
  broadcast(true, :restarted)
  true
end
resume!() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 49
def resume!
  return false unless paused?
  do_resume
  broadcast(true, :resumed)
  true
end

Private Instance Methods

do_pause() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 80
def do_pause
  @paused = true
  nil
end
do_reset() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 91
def do_reset
  rebuild_context
  do_resume
  reschedule_deferred
  nil
end
do_restart() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 98
def do_restart
  rebuild_context
  reject_deferred
  do_resume
  nil
end
do_resume() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 85
def do_resume
  @paused = false
  reschedule_deferred
  nil
end
rebuild_context() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 105
def rebuild_context
  core.allocate_context
  core.build_context
  nil
end
reject_deferred() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 116
def reject_deferred
  @deferred.each { |envelope| reject_envelope envelope }
  @deferred.clear
end
reschedule_deferred() click to toggle source
# File lib/concurrent/actor/behaviour/pausing.rb, line 111
def reschedule_deferred
  @deferred.each { |envelope| core.schedule_execution { core.process_envelope envelope } }
  @deferred.clear
end