Прежде всего, кажется, что в вашем коде есть опечатка:
if ("Boot".equals(action)) {
val bootActor: ActorRef = actorSystem.actorOf(Props[BootActor])
childActor ! msg
} else if ("Start".equals(action)) {
val startActor: ActorRef = actorSystem.actorOf(Props[StartActor])
startActor ! msg
}
Сообщение в первом условном предложении должно быть отправлено на bootActor
вместо childActor
, который не определен вВаш фрагмент кода.
Другая проблема заключается в том, что вы используете actorSystem.actorOf
для создания дочерних актеров.Этот метод создает актеров «верхнего уровня», которые должны быть сведены к минимуму.Актеры, созданные с помощью actorSystem.actorOf
, находятся под наблюдением актера-хранителя .Что это означает в отношении вашего кода, так это то, что когда ParentActor
останавливается (т.е. когда WebSocket закрыт, Play останавливает актера, используемого в ActorFlow
, как описано здесь ), множественные экземплярыBootActor
и StartActor
будут не остановлены, оставив вас с кучей бездействующих актеров высшего уровня.Для решения этой проблемы необходимо использовать context.actorOf
для создания экземпляров BootActor
и StartActor
: это делает эти экземпляры потомками ParentActor
.
Кроме того, вместо оператора ==
следует использовать оператор *1026*.equals
method.
Вот вышеупомянутые изменения:
if ("Boot" == action) {
val bootActor: ActorRef = context.actorOf(Props[BootActor])
bootActor ! msg
} else if ("Start" == action) {
val startActor: ActorRef = context.actorOf(Props[StartActor])
startActor ! msg
}
Вышесказанное можно немного упростить до следующего:
val childActor =
if (action == "Boot") context.actorOf(Props[BootActor])
else context.actorOf(Props[StartActor])
childActor ! msg
Для дальнейшего упрощения вашего кодаНе создавайте дочерних актеров, которые в этом случае не нужны.Переместите всю логику взаимодействия с out
актером в одного актера.