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
Calls superclass method
Concurrent::Actor::Behaviour::Abstract.new
# 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