Тупик в актерах Акка Скала

У меня очень простая структура, основанная на актерах 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,

Другие вопросы по тегам