2

Akka How to run akkaActor in IntelliJ IDEA を実行できるようにするために、 main メソッドを含むクラスには必要がないようです。ただし、ここに私が持っているものがあります:

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

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これを開始することができます)、このアクターになんらかの目的を与えることができます。とにかく、前述のように、現在のアプローチは問題ないように見えますが、必要に応じてこれもオプションになる可能性があります。

編集

したがって、ApplicationActor経由でこれを実行したい場合は、こちらakka.Mainの手順に従って、コマンド プロンプトからこれを実行します。

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

<all those JARS>もちろん、akka を含む依存関係を提供する必要があります。これを実行するには、少なくともクラスパスにscala-libraryとが必要です。akka-actor

于 2013-07-27T15:03:28.430 に答える
1

http://doc.akka.io/docs/akka/snapshot/scala/hello-world.htmlを参照すると、 akka.Main がルート/親アクタを想定していることがわかります。あなたの場合、スーパーバイザー。既存のコードについては、アクター コードに直接コピーすることができます。初期化呼び出しの場合もあります。たとえば、HelloWorld の preStart 関数を参照してください。

ただし、私の意見では、既存のコードも問題ありません。Akka.main は、マイクロカーネル バイナリと同様に優れたヘルパーです。ただし、独自のメイン実行可能ファイルを作成することも実行可能なオプションです。

于 2013-07-27T05:43:27.853 に答える