2013-07-27 4 views
1

Кажется, что нет необходимости в классе с основным методом в нем, чтобы иметь возможность запускать Akka How to run akka actors in IntelliJ IDEA. Однако, вот что у меня есть:Как запустить Akka

object Application extends App { 
    val system = ActorSystem() 
    val supervisor = system.actorOf(Props[Supervisor]) 
    implicit val timeout = Timeout(100 seconds) 

    import system.dispatcher 

    system.scheduler.schedule(1 seconds, 600 seconds) { 
    val future = supervisor ? Supervisor.Start 
    val list = Await.result(future, timeout.duration).asInstanceOf[List[Int]] 
    supervisor ! list 
    } 
} 

Я знаю, что я должен указать основной метод, называемый «akka.Main» в конфигурации. Но тем не менее, где я должен переместить текущий код с object Application?

+0

Никогда не используйте Await, если вам это не нужно, и вам не нужно. supervisor.tell (Supervisor.Start, supervisor) –

ответ

1

Если вы ссылаетесь на http://doc.akka.io/docs/akka/snapshot/scala/hello-world.html, вы обнаружите, что akka.Main ожидает вашего root/parent Actor. В вашем случае, Супервизор. Что касается вашего уже существующего кода, он может быть скопирован непосредственно в код участников, возможно, в некоторых вызовах инициализации. Например, обратитесь к функции preStart HelloWorld.

Однако, на мой взгляд, ваш уже существующий код тоже прекрасен. Akka.main - хороший помощник, также как и микроядра. Но создание собственного основного исполняемого файла также является жизнеспособным вариантом.

+0

Я не понимаю, что мне делать? –

+0

Что kdrakon говорит, что ничто не мешает вам писать свой собственный обычный основной метод, создавая там актерскую систему, а затем создавая и останавливая актеров, как вы хотите. –

+0

@EndreVarga, не могли бы вы показать мне пример?Должен ли я заключить свой код внутри приложения в 'def main (Array [String] args)' и это будет? –

4

Я согласен с @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 в вашем пути к классу, чтобы этот прогон.

+0

должен быть более стандартный, элегантный способ сделать это. Если «получение» пуст, возможно, ваш подход неверен. –

+0

Нет, нет, актер с пустым методом приема полностью действителен и полезен. Одним из важных вариантов использования является актеры с единственной целью - быть руководителями. –

+0

не могу переместить этот код в Supervisor вместо ApplicationActor? (что нам даже не нужно будет создавать тогда). –

4

Вы можете написать что-то вроде

import _root_.akka.Main 
object Application extends App { 
    Main.main(Array("somepackage.Supervisor")) 
} 

и супервизора актер должен перекрываться функцию PRESTART, как @cmbaxter предложил.

Затем запустите консоль sbt в intellij и запустите запись.

+0

Использование метода akka.Main.main() довольно прямолинейно. – tuxdna

Смежные вопросы