Я согласен с @kdrakon, что ваш код прекрасно, как она есть, но если вы хотите, чтобы эффективно использовать akka.Main
функциональность, то простой рефакторинг, как так будет делать вещи работать:
package code
class ApplicationActor extends Actor {
override def preStart = {
val supervisor = context.actorOf(Props[Supervisor])
implicit val timeout = Timeout(100 seconds)
import context.dispatcher
context.system.scheduler.schedule(1 seconds, 600 seconds) {
val future = (supervisor ? Supervisor.Start).mapTo[List[Int]]
val list = Await.result(future, timeout.duration)
supervisor ! list
}
}
def receive = {
case _ => //Not sure what to do here
}
}
В этом случае , ApplicationActor
- это аргумент, который вы передадите akka.Main
, и в основном это будет корневой супервизор для всех других участников, созданных в вашей иерархии. Единственная интересная вещь в том, что, будучи Actor
, ей нужна реализация receive
, и я не думаю, что какие-либо другие актеры будут отправлять сообщения здесь, поэтому на самом деле она ничего не делает. Но сила этого подхода заключается в том, что когда ApplicationActor
остановлен, остановка также будет каскадирована для всех других действующих лиц, которые она начала, упрощая изящное завершение работы. Я полагаю, вы могли бы обработать сообщение ApplicationActor
, чтобы отключить систему актеров, учитывая какой-то вход (возможно, ShutdownHookThread
может инициировать это) и дать этому актеру какую-то цель в конце концов. В любом случае, как было сказано ранее, ваш нынешний подход кажется прекрасным, но это также может быть вариантом, если вы этого желаете.
EDIT
Так что если вы хотите запустить этот ApplicationActor
через akka.Main
, в соответствии с инструкциями here, вы должны выполнить это из командной строки:
java -classpath <all those JARs> akka.Main code.ApplicationActor
Вы, конечно, нужно поставьте <all those JARS>
с вашими зависимостями, включая akka. Как минимум вам понадобятся scala-library
и akka-actor
в вашем пути к классу, чтобы этот прогон.
Никогда не используйте Await, если вам это не нужно, и вам не нужно. supervisor.tell (Supervisor.Start, supervisor) –