class Concurrent::Actor::Behaviour::Termination

Handles actor termination. Waits until all its children are terminated, can be configured on behaviour initialization. @note Actor rejects envelopes when terminated. @note TODO missing example

Attributes

terminated[R]

@!attribute [r] terminated

@return [Edge::Event] event which will become set when actor is terminated.

Public Class Methods

new(core, subsequent, core_options, trapping = false, terminate_children = true) click to toggle source
# File lib/concurrent/actor/behaviour/termination.rb, line 15
def initialize(core, subsequent, core_options, trapping = false, terminate_children = true)
  super core, subsequent, core_options
  @terminated         = Concurrent.future
  @public_terminated  = @terminated.hide_completable
  @trapping           = trapping
  @terminate_children = terminate_children
end

Public Instance Methods

on_envelope(envelope) click to toggle source
# File lib/concurrent/actor/behaviour/termination.rb, line 37
def on_envelope(envelope)
  command, reason = envelope.message
  case command
  when :terminated?
    terminated?
  when :terminate!
    if trapping? && reason != :kill
      pass envelope
    else
      terminate! reason, envelope
    end
  when :termination_event
    @public_terminated
  else
    if terminated?
      reject_envelope envelope
      MESSAGE_PROCESSED
    else
      pass envelope
    end
  end
end
terminate!(reason = nil, envelope = nil) click to toggle source

Terminates the actor. Any Envelope received after termination is rejected. Terminates all its children, does not wait until they are terminated.

# File lib/concurrent/actor/behaviour/termination.rb, line 62
def terminate!(reason = nil, envelope = nil)
  return true if terminated?

  self_termination = Concurrent.completed_future(reason.nil?, reason.nil? || nil, reason)
  all_terminations = if @terminate_children
                       Concurrent.zip(*children.map { |ch| ch.ask(:terminate!) }, self_termination)
                     else
                       self_termination
                     end

  all_terminations.chain_completable(@terminated)
  all_terminations.chain_completable(envelope.future) if envelope && envelope.future

  broadcast(true, [:terminated, reason]) # TODO do not end up in Dead Letter Router
  parent << :remove_child if parent

  MESSAGE_PROCESSED
end
terminated?() click to toggle source

@note Actor rejects envelopes when terminated. @return [true, false] if actor is terminated

# File lib/concurrent/actor/behaviour/termination.rb, line 25
def terminated?
  @terminated.completed?
end
trapping=(val) click to toggle source
# File lib/concurrent/actor/behaviour/termination.rb, line 33
def trapping=(val)
  @trapping = !!val
end
trapping?() click to toggle source
# File lib/concurrent/actor/behaviour/termination.rb, line 29
def trapping?
  @trapping
end