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-ruby-edge/concurrent/actor/behaviour/termination.rb, line 17 def initialize(core, subsequent, core_options, trapping = false, terminate_children = true) super core, subsequent, core_options @terminated = Concurrent::Promises.resolvable_future @public_terminated = @terminated.with_hidden_resolvable @trapping = trapping @terminate_children = terminate_children end
Public Instance Methods
on_envelope(envelope)
click to toggle source
# File lib/concurrent-ruby-edge/concurrent/actor/behaviour/termination.rb, line 39 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-ruby-edge/concurrent/actor/behaviour/termination.rb, line 64 def terminate!(reason = nil, envelope = nil) return true if terminated? self_termination = Concurrent::Promises.resolved_future(reason.nil?, reason.nil? || nil, reason) all_terminations = if @terminate_children Concurrent::Promises.zip(*children.map { |ch| ch.ask(:terminate!) }, self_termination) else self_termination end all_terminations.chain_resolvable(@terminated) if envelope && envelope.future all_terminations.chain { |fulfilled, _, t_reason| envelope.future.resolve fulfilled, true, t_reason } end 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-ruby-edge/concurrent/actor/behaviour/termination.rb, line 27 def terminated? @terminated.resolved? end
trapping=(val)
click to toggle source
# File lib/concurrent-ruby-edge/concurrent/actor/behaviour/termination.rb, line 35 def trapping=(val) @trapping = !!val end
trapping?()
click to toggle source
# File lib/concurrent-ruby-edge/concurrent/actor/behaviour/termination.rb, line 31 def trapping? @trapping end