- it was always intended that tell() (and sendSystemMessage()) shall not
throw any exceptions
- this is implemented by swallowing in ActorCell
(suspend/resume/restart/stop/!/sendSystemMessage) and in
RemoteActorRef (!/sendSystemMessage)
- current implementation uses a normal method, which adds overhead but
keeps the code in one place (ActorCell.catchingSend); this is a great
opportunity for making use of macros
- this discovered some pretty nice race conditions when creating actors
synchronously (i.e. system.actorOf) vs. the recent fault-handling fix
which discards Failed from old incarnations of a certain child
- as a consequence, all actor creation MUST be registered with the
parent before dispatching the Supervise message
This has brought to light some interesting effects (aka bugs) both in
the general implementation as well as in previous fixes.
SupervisorHierarchySpec is without TODOs now and GREEN.
- always suspend/resume for Suspend/Resume/Recreate, no matter which
state the actor is in, to keep the counter balanced
- preRestart failures are logged but otherwise ignored; there’s nothing
else (apart from terminating the actor) which we could do at that
point
- preRestart/postRestart exceptions have their own distinguishable
subtype of ActorKilledException now
- fix some race conditions in tests to make them produce fewer false
failures
- remove cruft from SupervisorStrategy and add methods which can
actually be used to implement your own (with proper warning signs)
- it’s a completely new-written thing in pure Java, so that “protected”
modifiers actually work and no ghost errors appear wrt. inheriting
from PartialFunction or similar
- it also features integration with the EventFilter
- all closure-based constructs are modeled as inner classes of the
JavaTestKit, where the user needs to override a single method which
will then be executed
* Change build to propagate all system properties starting with 'akka.'
to multi-jvm and multi-node tests.
* Adjusted AkkaSpec and MultiNodeSpec to use load of the config, which
means that default overrides (system properties) are used.
- introducing RepointableActorRef, which starts out with an
UnstartedActorCell which can cheaply be created; the Supervise()
message will trigger child.activate() in the supervisor, which means
that the actual creation (now with normal ActorCell) happens exactly
in the right place and with the right semantics. Messages which were
enqueued to the dummy cell are transferred atomically into the
ActorCell (using normal .tell()), so message sends keep working
exactly as they used to
- this enables getting rid of the brittle synchronization around
RoutedActorRef by replacing that one with a RepointableActorRef
subclass which creates RoutedActorCells upon activate(), with the nice
benefit that there is no hurry then to get it right because the new
cell is constructed “on the side”
misc fixes:
- InvalidMessageException is now actually enforced when trying to send
“null”
- Mailboxes may be created without having an ActorCell, which can come
in handy later, because the cell is only needed when this mailbox is
going to be scheduled on some executor
- remove occurrences of Props(), which is equivalent to Props[Nothing],
which is equivalent to «bug»
- add test case which verifies that context.actorOf is still synchronous
- plus all the stuff I have forgotten.