Akkaアクターを停止するさまざまな方法
1. 序章
Akka は、ScalaとJavaで非常に人気のあるアクターツールキットです。 アクターは、特定の計算を行うスレッドのような軽量ユニットです。 必要な数のアクターを作成できます。 計算が完了したら、これらのアクターを停止できます。
このチュートリアルでは、アクターを停止するさまざまな方法を見ていきます。
2. 設定
まず、Akkaの依存関係を持つ簡単なプロジェクトを設定しましょう。
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-actor" % "2.6.18",
"com.typesafe.akka" %% "akka-testkit" % "2.6.18" % Test
)
3. stop()メソッドの使用
ActorSystemのstop()メソッドを使用して、アクターを停止できます。 これにより、現在のメッセージの処理が完了すると、アクターが停止します。 メールボックス内の残りのすべてのメッセージは、DeadLettersに送信されます。 やるだけやってみよう:
val system = ActorSystem("system")
val actor = system.actorOf(Props(classOf[MessageProcessorActor])) <br />actor ! Greet("Msg 1")
actor ! Greet("Msg 2")
actor ! Greet("Msg 3")
system.stop(actor)
メッセージMsg1 の処理中にアクターが停止した場合、アクターはメールボックスを一時停止し、現在の処理が完了するのを待ちます。 完了すると、アクターは停止し、メールボックス内の残りのメッセージはDeadLettersに送信されます。 現在のアクターが停止した後、 postStop()フックを呼び出してリソースをクリーンアップします。
停止したアクターに子アクターがいる場合は、すべての子アクターに通知されます。 現在の処理が完了するとすぐに、すべての子アクターも停止されます。 その後、親アクターは停止されます。 したがって、アクターは階層内でボトムアップ方式で停止されます。
アクターの停止は非同期プロセスであることに注意してください。つまり、アクターが完全に停止する前に stop()メソッドが返される場合があります。
子アクターの1つが長い計算を処理していて、その停止メッセージを実行できない場合、階層全体がスタックする可能性があります。
ActorContextのstop()メソッドを使用して、アクターをそれ自体の内部から停止することもできます。
context.stop(self)
4. PoisonPillメッセージの使用
アクターを停止する別の方法は、PoisonPillと呼ばれる特別なタイプのメッセージをアクターに送信することです。 このメッセージは他のメッセージと同じように機能し、アクターのメールボックスにキューに入れられます。 アクターがこのメッセージを見つけると、それ自体が停止します。つまり、PoisonPillの前のすべてのメッセージが正常に処理されます。 PoisonPillの後に届いたメッセージはDeadLettersに送信されます。
PoisonPillをアクターに送信しましょう。
actor ! PoisonPill
5. gracefulStopを使用する
try {
val stopped: Future[Boolean] = gracefulStop(actor, 5 seconds, PoisonPill)
Await.result(stopped, 6 seconds)
} catch {
// the actor wasn't stopped within 5 seconds
case e: akka.pattern.AskTimeoutException =>
}
6. Killを使用する
キルメッセージを使用してアクターを停止することもできます。 アクターがKillメッセージを受け取るとすぐに、現在の処理メッセージを完了し、ActorKilledExceptionをスローします。 したがって、スーパーバイザアクターは通知を受け取り、構成された監視戦略に基づいて状況を処理します。
キルメッセージは次のように送信できます。
actor ! Kill
7. 結論
この記事では、Akkaアクターを停止するさまざまな方法について説明しました。
いつものように、サンプルコードはGitHubでから入手できます。