Complete beginner here in Akka 2.2, trying a modified version of the Hello World. The modification is that I create 1000 actors instead of one. Running it, I don't get all 1000 hello worlds returned, with this error trace, repeated for several messages:
[07/23/2013 22:22:45.924] [Main-akka.actor.default-dispatcher-2] [akka://Main/user/app/$Si] Message [net.clementlevallois.akkatest.Greeter$Msg] from Actor[akka://Main/user/app#1478796310] to Actor[akka://Main/user/app/$Si#-1309206213] was not delivered. 1 dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
The two classes:
public class App extends UntypedActor {
@Override
public void preStart() {
// create the greeter actors
List<ActorRef> actorRefs = new ArrayList();
for (int i = 0; i < 1000; i++) {
final ActorRef greeter = getContext().actorOf(Props.create(Greeter.class, i));
this.getContext().watch(greeter);
actorRefs.add(greeter);
}
// tell it to perform the greeting
for (ActorRef actorRef : actorRefs) {
actorRef.tell(Greeter.Msg.GREET, getSelf());
}
}
@Override
public void onReceive(Object msg) {
if (msg instanceof DeadLetter) {
System.out.println(msg);
} else if (msg == Greeter.Msg.DONE) {
// when the greeter is done, stop this actor and with it the application
getContext().stop(getSelf());
} else {
unhandled(msg);
}
}
}
public class Greeter extends UntypedActor {
String input;
public static enum Msg {
GREET, DONE;
}
public Greeter(int i) {
input = String.valueOf(i);
}
@Override
public void onReceive(Object msg) {
if (msg == Msg.GREET) {
System.out.println("Hello World! " + input);
getSender().tell(Msg.DONE, getSelf());
} else {
unhandled(msg);
}
}
}
I would appreciate any help on debugging, and advice on whether creating lists of actors as done here is alright or not.
Msg.DONE
's sitting in the App actor's queue since you shutdown after the first one? – Noah