public interface Actor
An actor has a well-defined (non-cyclic) life-cycle. - ''RUNNING'' (created and started actor) - can receive messages - ''SHUTDOWN'' (when 'stop' is invoked) - can't do anything
The Actor's own ActorRef
is available as self
, the current
message’s sender as sender()
and the ActorContext
as
context
. The only abstract method is receive
which shall return the
initial behavior of the actor as a partial function (behavior can be changed
using context.become
and context.unbecome
).
This is the Scala API (hence the Scala code below), for the Java API see UntypedActor
.
class ExampleActor extends Actor {
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _: ArithmeticException => Resume
case _: NullPointerException => Restart
case _: IllegalArgumentException => Stop
case _: Exception => Escalate
}
def receive = {
// directly calculated reply
case Request(r) => sender() ! calculate(r)
// just to demonstrate how to stop yourself
case Shutdown => context.stop(self)
// error kernel with child replying directly to 'sender()'
case Dangerous(r) => context.actorOf(Props[ReplyToOriginWorker]).tell(PerformWork(r), sender())
// error kernel with reply going through us
case OtherJob(r) => context.actorOf(Props[ReplyToMeWorker]) ! JobRequest(r, sender())
case JobReply(result, orig_s) => orig_s ! result
}
}
The last line demonstrates the essence of the error kernel design: spawn
one-off actors which terminate after doing their job, pass on sender()
to
allow direct reply if that is what makes sense, or round-trip the sender
as shown with the fictitious JobRequest/JobReply message pair.
If you don’t like writing context
you can always import context._
to get
direct access to actorOf
, stop
etc. This is not default in order to keep
the name-space clean.
Modifier and Type | Interface and Description |
---|---|
static class |
Actor.emptyBehavior$
emptyBehavior is a Receive-expression that matches no messages at all, ever.
|
static class |
Actor.ignoringBehavior$
ignoringBehavior is a Receive-expression that consumes and ignores all messages.
|
Modifier and Type | Method and Description |
---|---|
void |
aroundPostRestart(java.lang.Throwable reason)
Can be overridden to intercept calls to
postRestart . |
void |
aroundPostStop()
Can be overridden to intercept calls to
postStop . |
void |
aroundPreRestart(java.lang.Throwable reason,
scala.Option<java.lang.Object> message)
Can be overridden to intercept calls to
preRestart . |
void |
aroundPreStart()
Can be overridden to intercept calls to
preStart . |
void |
aroundReceive(scala.PartialFunction<java.lang.Object,scala.runtime.BoxedUnit> receive,
java.lang.Object msg)
INTERNAL API.
|
ActorContext |
context()
Stores the context for this actor, including self, and sender.
|
void |
postRestart(java.lang.Throwable reason)
User overridable callback: By default it calls
preStart() . |
void |
postStop()
User overridable callback.
|
void |
preRestart(java.lang.Throwable reason,
scala.Option<java.lang.Object> message)
User overridable callback: '''By default it disposes of all children and then calls
postStop() .''' |
void |
preStart()
User overridable callback.
|
scala.PartialFunction<java.lang.Object,scala.runtime.BoxedUnit> |
receive()
This defines the initial actor behavior, it must return a partial function
with the actor logic.
|
ActorRef |
self()
The 'self' field holds the ActorRef for this actor.
|
ActorRef |
sender()
The reference sender Actor of the last received message.
|
SupervisorStrategy |
supervisorStrategy()
User overridable definition the strategy to use for supervising
child actors.
|
void |
unhandled(java.lang.Object message)
User overridable callback.
|
ActorContext context()
forward
.
WARNING: Only valid within the Actor itself, so do not close over it and publish it to other threads!
ActorContext
is the Scala API. getContext
returns a
UntypedActorContext
, which is the Java API of the actor
context.
ActorRef self()
self ! message
ActorRef sender()
deadLetters
in ActorSystem
.
WARNING: Only valid within the Actor itself, so do not close over it and publish it to other threads!
scala.PartialFunction<java.lang.Object,scala.runtime.BoxedUnit> receive()
void aroundReceive(scala.PartialFunction<java.lang.Object,scala.runtime.BoxedUnit> receive, java.lang.Object msg)
Can be overridden to intercept calls to this actor's current behavior.
receive
- current behavior.msg
- current message.void aroundPreStart()
preStart
. Calls preStart
by default.void aroundPostStop()
postStop
. Calls postStop
by default.void aroundPreRestart(java.lang.Throwable reason, scala.Option<java.lang.Object> message)
preRestart
. Calls preRestart
by default.reason
- (undocumented)message
- (undocumented)void aroundPostRestart(java.lang.Throwable reason)
postRestart
. Calls postRestart
by default.reason
- (undocumented)SupervisorStrategy supervisorStrategy()
void preStart() throws java.lang.Exception
java.lang.Exception
void postStop() throws java.lang.Exception
java.lang.Exception
void preRestart(java.lang.Throwable reason, scala.Option<java.lang.Object> message) throws java.lang.Exception
postStop()
.'''reason
- the Throwable that caused the restart to happenmessage
- optionally the current message the actor processed when failing, if applicable
Is called on a crashed Actor right BEFORE it is restarted to allow clean
up of resources before Actor is terminated.java.lang.Exception
void postRestart(java.lang.Throwable reason) throws java.lang.Exception
preStart()
.reason
- the Throwable that caused the restart to happen
Is called right AFTER restart on the newly created Actor to allow reinitialization after an Actor crash.java.lang.Exception
void unhandled(java.lang.Object message)
DeathPactException
(in
case of an unhandled Terminated
message) or publishes an UnhandledMessage
to the actor's system's EventStream
message
- (undocumented)