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:docs-source/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
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 117 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. @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.global_fast_executor) do |increment_by| lambda { |number| number + increment_by } end inc2.ask!(2) # => 4
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 122 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.
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 132 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
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 98 def ask(message) raise 'actor cannot ask itself' end
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 72 def behaviour_definition raise NotImplementedError end
@return [Array<Array(Behavior::Abstract, Array<Object>)>]
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 67 def dead_letter_routing parent.dead_letter_routing 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]
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 89 def default_executor Concurrent.global_io_executor end
override to se different default executor, e.g. to change it to global_fast_executor @return [Executor]
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 83 def default_reference_class Reference end
override if different class for reference is needed @return [CLass] descendant of {Reference}
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 77 def envelope @envelope or raise 'envelope not set' end
@return [Envelope] current envelope, accessible inside on_message
processing
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 46 def on_envelope(envelope) @envelope = envelope on_message envelope.message ensure @envelope = nil end
@api private
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 42 def on_event(event) end
override to add custom code invocation on internal events like ‘:terminated`, `:resumed`, `anError`.
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 37 def on_message(message) raise NotImplementedError 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 Reference#ask
@note self should not be returned (or sent to other actors), {#reference} should be used
instead
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 55 def pass core.behaviour!(Behaviour::ExecutesContext).pass envelope end
if you want to pass the message to next behaviour, usually {Behaviour::ErrorsOnUnknownMessage}
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 94 def tell(message) reference.tell message end
tell self a message
Private Instance Methods
Source
# File lib/concurrent-ruby-edge/concurrent/actor/context.rb, line 128 def initialize_core(core) @core = Type! core, Core end