class Concurrent::Actor::AbstractContext
New actor is defined by subclassing {RestartingContext}, {Context} and defining its abstract methods. {AbstractContext} can be subclassed directly to implement more specific behaviour see {Root} implementation.
-
{Context}
> {include:Actor::Context}
-
{RestartingContext}.
> {include:Actor::RestartingContext}
Example of ac actor definition:
{include:file:doc/actor/define.out.rb}
See methods of {AbstractContext} what else can be tweaked, e.g {AbstractContext#default_reference_class}
@abstract implement {AbstractContext#on_message} and {AbstractContext#behaviour_definition}
Attributes
Public Class Methods
Behaves as {Concurrent::Actor.spawn} but :class is auto-inserted based on receiver so it can be omitted. @example by class and name
AdHoc.spawn(:ping1) { -> message { message } }
@example by option hash
inc2 = AdHoc.spawn(name: 'increment by 2', args: [2], executor: Concurrent.configuration.global_task_pool) do |increment_by| lambda { |number| number + increment_by } end inc2.ask!(2) # => 4
# File lib/concurrent/actor/context.rb, line 115 def self.spawn(name_or_opts, *args, &block) Actor.spawn to_spawn_options(name_or_opts, *args), &block end
behaves as {Concurrent::Actor.spawn!} but :class is auto-inserted based on receiver so it can be omitted.
# File lib/concurrent/actor/context.rb, line 120 def self.spawn!(name_or_opts, *args, &block) Actor.spawn! to_spawn_options(name_or_opts, *args), &block end
Private Class Methods
# File lib/concurrent/actor/context.rb, line 130 def self.to_spawn_options(name_or_opts, *args) if name_or_opts.is_a? ::Hash if name_or_opts.key?(:class) && name_or_opts[:class] != self raise ArgumentError, ':class option is ignored when calling on context class, use Actor.spawn instead' end name_or_opts.merge class: self else { class: self, name: name_or_opts, args: args } end end
Public Instance Methods
# File lib/concurrent/actor/context.rb, line 96 def ask(message) raise 'actor cannot ask itself' end
@return [Array<Array(Behavior::Abstract, Array<Object>)>]
# File lib/concurrent/actor/context.rb, line 70 def behaviour_definition raise NotImplementedError end
Defines an actor responsible for dead letters. Any rejected message send with {Reference#tell} is sent there, a message with future is considered already monitored for failures. Default behaviour is to use {AbstractContext#dead_letter_routing} of the parent, so if no {AbstractContext#dead_letter_routing} method is overridden in parent-chain the message ends up in `Actor.root.dead_letter_routing` agent which will log warning. @return [Reference]
# File lib/concurrent/actor/context.rb, line 65 def dead_letter_routing parent.dead_letter_routing end
override to se different default executor, e.g. to change it to global_operation_pool @return [Executor]
# File lib/concurrent/actor/context.rb, line 87 def default_executor Concurrent.global_io_executor end
override if different class for reference is needed @return [CLass] descendant of {Reference}
# File lib/concurrent/actor/context.rb, line 81 def default_reference_class Reference end
@return [Envelope] current envelope, accessible inside on_message processing
# File lib/concurrent/actor/context.rb, line 75 def envelope @envelope or raise 'envelope not set' end
@api private
# File lib/concurrent/actor/context.rb, line 44 def on_envelope(envelope) @envelope = envelope on_message envelope.message ensure @envelope = nil end
override to add custom code invocation on internal events like `:terminated`, `:resumed`, `anError`.
# File lib/concurrent/actor/context.rb, line 40 def on_event(event) end
@abstract override to define Actor's behaviour @param [Object] message @return [Object] a result which will be used to set the Future supplied to Concurrent::Actor::Reference#ask @note self should not be returned (or sent to other actors), {#reference} should be used
instead
# File lib/concurrent/actor/context.rb, line 35 def on_message(message) raise NotImplementedError end
if you want to pass the message to next behaviour, usually {Behaviour::ErrorsOnUnknownMessage}
# File lib/concurrent/actor/context.rb, line 53 def pass core.behaviour!(Behaviour::ExecutesContext).pass envelope end
tell self a message
# File lib/concurrent/actor/context.rb, line 92 def tell(message) reference.tell message end
Private Instance Methods
# File lib/concurrent/actor/context.rb, line 126 def initialize_core(core) @core = Type! core, Core end