Akka(2.0)アクターシステムを起動し、いくつかのメッセージを送信して、それが重労働を行うのを待つ必要があります。その後、私はそれらの俳優とは関係のない何かをする必要があります。
私はすべてのアクターが次のコードで停止するのを待とうとしました:
val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start
system.awaitTermination // <-- hangs here
すべてのアクターはself ! PoisonPill
を介して自殺します。私は何が間違っているのですか?
Akka 2.4.1 for scala 2.11では、再び異なるように見えます。
system.awaitTermination()
は非推奨であり、ドキュメントでは代わりにAwait.result(system.whenTerminated, timeout)
を使用するように指示されています。
2 が言ったように、_system.terminate
_はまだシステムを終了する方法です。
これが私が使用したいくつかのサンプルコードです:
_val actorSystem = ActorSystem("ActorSystem")
val myActors = actorSystem.actorOf(Props[MyActor].withRouter(RoundRobinPool(10)), "MyActors")
rainbows.foreach(Rainbow => myActors ! Rainbow)
Await.ready(actorSystem.whenTerminated, Duration(1, TimeUnit.MINUTES))
_
次に、MyActorクラスにcontext.system.terminate()
という行があります。
Akka 2.4以降では、system.awaitTermination()
を使用する必要があります。これにより、待機できる_Future[Terminated]
_が返されます。
システムを終了するには、終了時にアクター内から_ActorSystem.terminate
_を使用する必要があります(例:context.system.terminate()
。
出典: リリースノート
タイトルについてこの質問に遭遇した人への補足:どうやら、Akka 2.5は_actorSystem.awaitTermination
_をサポートしなくなったようです。理由は、通話のブロックを回避するというAkkaの哲学である可能性があります。代わりに、actorSystem.registerOnTermination(...)
は、ActorSystem
がシャットダウンされている間にアクションを実行するための非ブロッキング方法として使用できます。
それでも、_ActorSystem.whenTerminated
_が提供するFuture
を介して、アクターシステムが完了するのを待つことができます。
_val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start
import scala.concurrent.Await
import scala.concurrent.duration._
Await.ready(system.whenTerminated, 365.days)
_
私は解決策を見つけました-マスターアクターからsystem.shutdownを呼び出すだけです:
context.system.shutdown
system.shutdown
を使用して、メインスレッドからActorSystem
を強制終了することもできます。ただし、その操作は非同期です。メインスレッドが完了するまでブロックする必要がある場合にのみ、system.awaitTermination
を使用する必要があります。 parallelRunnersがプログラムの残りの部分に役立つものを返す場合は、プログラムをブロックせずに続行するのがおそらく最も簡単です。
どうですか:
import scala.concurrent.Await
import scala.concurrent.duration._
Await.ready(system.terminate(), 5.seconds)
終了は未来を返します:
def terminate(): Future[Terminated]
そして、あなたはこの未来の完成を待つことができます。
akka 2.3.9では、アクターシステムをシャットダウンし、シャットダウンするのを待つことは2段階のプロセスのようです。
actorSystem.shutdown
actorSystem.awaitTermination
手順(2)の代わりに、おそらく(これらの選択肢をテストしていない)、代わりにisTerminated
でポーリングするか、終了時にコードを実行するためにregisterOnTermination
を使用することができます。したがって、akka.actor.ActorSystemのコメントを調べて、実装にこれらのメソッドを理解して選択することをお勧めします。
おそらく、Future
の戻り値の方が良かったので、API(?)に関する他のオプションがありません。