We are using akka 2.5.22 and we have been in process of migrating our project to typed for more than a week now. We replaced all our untyped actors to typed and now we are trying to replace our top level untyped actor system to typed.
We got stuck in replacing our actor system to typed because we have multi-jvm/multi-node tests in our project.
We extend MultiNodeSpec for our multi-jvm test and it happens to take untyped actor system to create actors internally via untypedSystem.actorOf. And we want to keep our top level actor system to be typed. So, When we create a typed system, adapt it to untyped and pass it to MultiNodeSpec then, the test fails with the following exception:
[error] Exception in thread "main" java.lang.UnsupportedOperationException: cannot create top-level actor from the outside on ActorSystem with custom user guardian
[error] at akka.actor.ActorSystemImpl.actorOf(ActorSystem.scala:786)
[error] at App1$.delayedEndpoint$App1$1(App1.scala:12)
[error] at App1$delayedInit$body.apply(App1.scala:6)
[error] at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error] at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error] at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error] at scala.App.$anonfun$main$1$adapted(App.scala:80)
[error] at scala.collection.immutable.List.foreach(List.scala:392)
[error] at scala.App.main(App.scala:80)
[error] at scala.App.main$(App.scala:78)
[error] at App1$.main(App1.scala:6)
[error] at App1.main(App1.scala)
So, while tracing back the exception, we got to know that untypedSystem.actorOf checks if a custom guardian is wired or not, if it is then it throws the above mentioned exception and in case of untypedSystem being created from typed system will always have a guardian actor (in our case guardian actor is an actor with empty behavior).
For more details about this error please refer this discussion.
So, we feel that we are left with following options:
-
Abandon the task of migrating project to fully typed project
-
ActorSystemImpldoes not throw the above mentioned error if typed system is adapted to untyped and used to create user space actor viauntypedSystem.actorOf -
MultiNodeSpeccreates internal actors viauntypedSystem.systemActorOfinstead ofuntypedSystem.actorOfassystemActorOfdoes not throw above exception when untypedSystem is adapted from typedSystem -
akka-multi-node-testkitgets migrated to typed andMultiNodeSpecexpects typed system instead of untyped system
So, to conclude, our question is how should we proceed for our task of migrating our project to fully typed project?