Тупик в актерах Акка Скала
У меня очень простая структура, основанная на актерах Akka в Scala, но я продолжаю получать предупреждения о недоставленных сообщениях. Это код для основного класса, Collector - это отдельный класс, расширяющий Actor:
object Executor extends App {
class ExecutorMaster extends Actor {
def receive() = {
case _ => Executor.actorSystem.actorOf(Props[Collector], name = "Collector") ! true
}
}
val actorSystem = ActorSystem("ReadScheduler")
private val app = actorSystem.actorOf(Props[ExecutorMaster], name = "Executor")
app ! true
}
Сообщение не доставляется в Collector, результат для кода:
[27.04.2014 18:09:05.518] [ReadScheduler-akka.actor.default-dispatcher-3] [akka://ReadScheduler/user/Collector] Сообщение [java.lang.Boolean] от Актера [akka://ReadScheduler/user/Executor#2127791644] для актера [akka://ReadScheduler/user/Collector#337715308] не был доставлен. [1] встреченные мертвые буквы. Это ведение журнала можно отключить или отрегулировать с помощью параметров конфигурации "akka.log-dead-letters" и "akka.log-dead-letters-while-shutdown".
Что может быть причиной этой неудачной доставки сообщения? Есть ли что-то, что я постоянно упускаю в этой концепции?
1 ответ
Вы должны использовать иерархию - запустите это Collector
как дитя ExecutorMaster
,
Что вы делаете внутри receive
Метод пытается создать актера с тем же именем, что и у другого, который создается после первого сообщения о том, что ExecutorMaster
получает.
Рассмотрите возможность использования:
val collector = context.actorOf(Props[Collector], name = "Collector")
def receive = {
case _ => collector ! true
}
Вы также должны использовать case object
а не примитив для определения значения true
,