Reputation: 1371
Confirming that every time you call Akka.system.actorOf or Akka.system.scheduler it'll create a new ActorSystem in the application? Looking at some code where it calls Akka.system.actorOf every time it has to create a new actor, which I think should have been context.actorOf to use the existing ActorSystem (which should have been created at the app startup). Is my understanding correct that calling Akka.system.actorOf every single time, to create a new actor, is very wrong?
Upvotes: 0
Views: 1270
Reputation: 141
You can only have one ActorSystem in a Cluster. thats why you cant use new. Something very similar to main..
trying to learn by answering to it.
Upvotes: 0
Reputation: 4427
According to the docs:
Using the ActorSystem will create top-level actors, supervised by the actor system’s provided guardian actor, while using an actor’s context will create a child actor.
So basically, it depends on what you want to achieve.
More details here.
EDIT:
Concerning your concrete question (I am sorry, I misunderstood you), you should see an ActorSystem
as a heavyweight structure that will allocate up to N threads, and each Actor will run within one of these threads (the key point here is that there is no mutable state). ActorSystems share common configuration, e.g. dispatchers, deployments, remote capabilities and addresses. They are also the entry point for creating or looking up actors.
Creating an ActorSystem
is very expensive, so you want to avoid creating a new one each time you need it. Also your actors should run in the same ActorSystem
, unless there is a good reason for them not to. The name of the ActorSystem
is also part the the path to the actors that run in it.
There is no Akka.system.actorOf
method in the current API. Normally you hold a reference to the application ActorSystem
as others already showed you, and create child actors from that context:
val system = akka.actor.ActorSystem("YourApplication");
val actor1 = system.actorOf(Props[Actor1], "Actor1")
val actor2 = system.actorOf(Props[Actor2], "Actor2")
So, in short, I have never tried it but I assume every call to akka.actor.ActorSystem
will try to create a new ActorSystem and it would probably fail if no different ActorSystem names/configurations are provided.
Upvotes: 2
Reputation: 127711
You create new ActorSystem
only when you call ActorSystem.apply
method:
val system = ActorSystem("YourApplication")
Of course, when you call methods on the system you do not create new systems, that is, the following:
val actor = system.actorOf(Props[SomeActor], "someActor")
won't create new system, it will just create new top-level actor in the system
. You usually call system.actorOf
method when you are outside of an actor, for example, in initialization code when there are no actors created yet.
context
, on the other hand, is a way to interact with the system from inside an actor. context
is a member of Actor
trait, which is inherited into your actors. You use context
to access actor system's scheduler, to watch actors, to create child actors, to change actor's behavior etc. context.actorOf
will create child actor.
So no, calling system.actorOf
for creating actors is absolutely not wrong. You just have to keep in mind that when you use system.actorOf
you're creating top-level actors, and that's not something you need always. Usually you create one or several top-level actors, which then in turn create child actors and so on.
Upvotes: 3