私は各アクタがいくつかの新しい子アクターを作成することができるAkkaアクターシステムを作成しようとしています。 例:Actor Aは200K行の入力ファイルを読み込み、の行ごとにを入力すると、そのテキスト行がActor Bに割り当てられます。Actor Bは、ビジネスロジックによってはActor Cなどを作成します。 (100行または1000行をし、派遣)読んだ後Akka&Java - デッドレターが発生しました
Message [java.lang.String] without sender to Actor[akka://My-Akka/user/$a/$b#304462457] was not delivered. [1] dead letters encountered. This logging can be turned off
:いくつかの時点でそのBアクターを派遣するとき、私は非一貫性行動に直面しています
は私がのエラーを取得します。すべての実行が異なります。
プログラムは、いくつかのマスタークラスで始まります:俳優Aでは
ActorSystem system = ActorSystem.create("My-Akka");
ActorRef actorA= system.actorOf(Props.create(ActorA.class));
actorA.tell("some text", ActorRef.noSender());
私はルータを作成しています:
Router router;
{
List<Routee> routees = new ArrayList<Routee>();
for (int i = 0; i < 5; i++) {
ActorRef r = getContext().actorOf(Props.create(ActorB.class));
getContext().watch(r);
routees.add(new ActorRefRoutee(r));
}
router = new Router(new RoundRobinRoutingLogic(), routees);
}
そして俳優AのcreateReceive関数内:
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, message -> {
....
String line;
while ((line = br.readLine()) != null) {
router.route(line, getSender());
}
}
}
})
.match(Terminated.class, message -> {
router = router.removeRoutee(message.actor());
ActorRef r = getContext().actorOf(Props.create(ActorB.class));
getContext().watch(r);
router = router.addRoutee(new ActorRefRoutee(r));
})
.build();
}
アクターBのcreateReceive関数:
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, s -> {
System.out.println("got message " + s);
})
.matchAny(o -> logger.info("received unknown message"))
.build();
}
私はここに何か不足していると思います。なぜなら、アクターAがデッドレターに達する前に、アクターBがアクターBに異なる数のメッセージを送信できるようになるのはなぜでしょうか。 すべての俳優が仕事をしていないうちに、マスタープログラムが終了していますか?このような場合は、何を変更する必要がありますか?
おかげ