2

似乎不需要在其中包含 main 方法的类中就可以运行 Akka How to run akka actor in IntelliJ IDEA。但是,这就是我所拥有的:

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

4

3 回答 3

5

你可以写类似

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

并且主管演员应该按照@cmbaxter的建议覆盖 preStart 函数。

然后在 intellij 中运行 sbt 控制台并编写运行。

于 2013-09-20T09:55:02.107 回答
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
  }

}

在这种情况下, theApplicationActor是您将传递给的参数akka.Main,它基本上是在您的层次结构中创建的所有其他参与者的根主管。这里唯一可疑的是,作为一个Actor,它需要一个receive实现,我不认为任何其他参与者会在这里发送消息,因此它并没有真正做任何事情。但是这种方法的强大之处在于,当ApplicationActor停止时,停止也将级联到它启动的所有其他参与者,从而简化了优雅的关闭。我想你可以在ApplicationActor给定某种输入的情况下处理一条消息来关闭演员系统(也许是ShutdownHookThread可以启动这个),毕竟给这个演员某种目的。无论如何,如前所述,您当前的方法似乎很好,但如果您愿意,这也可能是一种选择。

编辑

因此,如果您想通过 运行它ApplicationActorakka.Main根据此处的说明,您可以从命令提示符处执行它:

java -classpath <all those JARs> akka.Main code.ApplicationActor

您当然需要提供<all those JARS>包括 akka 在内的依赖项。至少你需要在你scala-libraryakka-actor类路径中运行这个。

于 2013-07-27T15:03:28.430 回答
1

如果您参考http://doc.akka.io/docs/akka/snapshot/scala/hello-world.html,您会发现 akka.Main 需要您的根/父 Actor。在你的情况下,主管。至于您已经存在的代码,它可以直接复制到参与者代码中,可能在一些初始化调用中。例如,参考 HelloWorld 的 preStart 函数。

但是,在我看来,您已经存在的代码也很好。Akka.main 是一个很好的助手,微内核二进制文件也是如此。但是创建自己的主要可执行文件也是一个可行的选择。

于 2013-07-27T05:43:27.853 回答